本文同步在学弟ZCDHJ的个人博客发布,审核需要一段时间.

传送门


考虑题目中获得的糖果并不包含所有的颜色这句话,发现相当于我们可以直接选取某一个颜色强制不能选(这样子一定最优).

然后就可以考虑分开解决上面和下面.

先考虑下面:

  1. 枚举颜色然后搞区间(不能包含这一种颜色)
  2. 按照横坐标的顺序删点,然后再看删除的点的颜色的区间是否会被更新

以上操作的话,查询区间可以用双向链表,区间求点(和)可以使用树状数组.

差不多就这样子了.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;
inline int gi(){
int sum=0,f=1;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
return f*sum;
}
int ans,n,K,c[500010],x[500010],l[500010],r[500010],last[500010],b[500010];
struct node{
int id,x,y,z;
}p[500010];
int lowbit(int x){
return x&-x;
}
void add(int x,int d){
for(;x<=n+1;x+=lowbit(x))c[x]+=d;
}
int query(int x){
int res=0;
for(;x>0;x-=lowbit(x))res+=c[x];
return res;
}
bool cmp1(node a,node b){
return a.x<b.x;
}
bool cmp2(node a,node b){
return a.y<b.y;
}
void update(int l,int r){
if(l>r)return;
ans=max(ans,query(r)-query(l-1));
}
void solve(){
x[0]=0;x[n+1]=n+1;
memset(c,0,sizeof(c));memset(last,0,sizeof(last));
sort(p+1,p+n+1,cmp1);
for(int i=1;i<=n;i++)add(p[i].x,1);
for(int i=1;i<=n;i++){
int t=p[i].id,L=last[p[i].z];
l[t]=L;r[t]=n+1;
if(L)r[L]=t;update(x[L]+1,x[t]-1);
last[p[i].z]=t;
}
for(int i=1;i<=K;i++)update(x[last[i]]+1,n+1);
sort(p+1,p+n+1,cmp2);
for(int i=1,j=1;i<=n;i++){
int t=p[i].id;
while(j<=n && p[i].y==p[j].y)add(p[j].x,-1),j++;
l[r[t]]=l[t];r[l[t]]=r[t];
update(x[l[t]]+1,x[r[t]]-1);
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
int T=gi();
while(T--){
ans=0;
n=gi();K=gi();
for(int i=1;i<=n;i++){
p[i].x=gi();p[i].y=gi();p[i].z=gi();
p[i].id=i;
}
for(int i=1;i<=n;i++)b[i]=p[i].x;
sort(&b[1],&b[n+1]);
for(int i=1;i<=n;i++){
p[i].x=lower_bound(b+1,b+n+1,p[i].x)-b;
x[i]=p[i].x;
}
solve();
for(int i=1;i<=n;i++)p[i].y=-p[i].y;
solve();
printf("%d\n",ans);
}
return 0;
}

最新文章

  1. GIT笔记命令行(1)
  2. 通过 listboxitem 查找属于listbox第几条数据
  3. YII2 缩略图生成 第三方包修改
  4. 不是SELECTed表达式
  5. 【bzoj1912】 Apio2010—patrol 巡逻
  6. 素材收集(icon/images/javascript)
  7. c# 调用打印机
  8. Cheatsheet: 2013 10.09 ~ 10.23
  9. Python实现C4.5(信息增益率)
  10. C指针赋值
  11. poj 2440 (找递推公式)
  12. 简单分析beyond作曲
  13. SqQueue(环状队列(顺序表结构))
  14. docker容器下mysql更改WordPress的site address和home(URL)------局域网
  15. liunx 运维知识三部分
  16. weak_ptr_c++11
  17. 什么是CSS hack?
  18. VIM编辑配置文件基本操作
  19. linux 实用指令
  20. Docker Hub Mirror

热门文章

  1. 用jquery操作字体颜色覆盖当前页面的css设置
  2. 2.spring整合ehcache 注解实现查询缓存,并实现实时缓存更新或删除
  3. python greenlet 背景介绍与实现机制
  4. php使用curl库进行ssl双向认证
  5. SpringMVC 执行流程
  6. Type Object——类型对象
  7. 把CString转化为char*
  8. Maven的pom.xml介绍
  9. 配置Linux防火墙
  10. PHP开启页面报错的代码