【BZOJ 4062】[Cerc2012]Jewel heist

来源:互联网 发布:linux 启动service 编辑:程序博客网 时间:2024/06/05 09:35
#include<cstdio>#include<cstring>#include<iostream>#include<set>#include<algorithm>#define maxn 200021using namespace std;int T,n,k,t[maxn],cnt,c[maxn];set<int>s[maxn];struct node{int x,y,c;bool operator<(const node& b)const{return y==b.y ? x<b.x : y<b.y;}}nod[maxn];void update(int x,int add){while(x<=cnt){c[x]+=add;x+=x&-x;}}int query(int x){int ans=0;while(x>0){ans+=c[x];x-=x&-x;}return ans;}int main(){scanf("%d",&T);while(T--){cnt=0;memset(c,0,sizeof(c));int ans=0;scanf("%d%d",&n,&k);for(int i=1;i<=n;i++)scanf("%d%d%d",&nod[i].x,&nod[i].y,&nod[i].c),t[++cnt]=nod[i].x;sort(t+1,t+1+cnt);cnt=unique(t+1,t+1+cnt)-t-1;for(int i=1;i<=n;i++)nod[i].x=lower_bound(t+1,t+1+cnt,nod[i].x)-t;for(int i=1;i<=k;i++){s[i].clear();s[i].insert(0),s[i].insert(cnt+1);}sort(nod+1,nod+1+n);set<int>::iterator it;int l,r;for(int c,j,i=1;i<=n;){for(j=i;j<=n&&nod[j].y==nod[i].y;j++){c=nod[j].c;it=s[c].lower_bound(nod[j].x);r=*it;l=*(--it);ans=max(ans,query(r-1)-query(l));}for(;i<j;i++){s[nod[i].c].insert(nod[i].x);update(nod[i].x,1);}}for(int i=1;i<=k;i++){int l=0;for(it=++s[i].begin();it!=s[i].end();it++){r=*it;ans=max(ans,query(r-1)-query(l));l=r;}}printf("%d\n",ans);}return 0;}


0 0
原创粉丝点击