萌新求助cdq分治
查看原帖
萌新求助cdq分治
92682
Eric_cai楼主2021/7/24 18:50
#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 200005
using namespace std;
struct node
{
	int a,b,c,ID,ans;
};
node x[maxn];
int n,k,Tree[maxn<<2],sum[maxn];
bool cmpa(node A,node B)
{
	if(A.a==B.a && A.b!=B.b) return A.b<B.b;
	if(A.a==B.a && A.b==B.b) return A.c<B.c;
	return A.a<B.a;
}
bool cmpb(node A,node B)
{
	if(A.b==B.b) return A.c<B.c; 
	return A.b<B.b;
}
int lowbit(int y)
{
	return y&(-y);
}
void update(int id,int y)
{
	for(int i=id;i<=n;i+=lowbit(i)) Tree[i]+=y;
}
int query(int id)
{
	int ret=0;
	for(int i=id;i>0;i-=lowbit(i)) ret+=Tree[i];
	return ret;
}
void get_ans(int l,int r)
{
	if(l==r) return;
	int mid=(l+r)>>1,p=l;
	get_ans(l,mid);
	get_ans(mid+1,r);
	//cout<<l<<" "<<r<<endl;
	//for(int i=l;i<=r;i++) cout<<x[i].ID<<" ";
	//cout<<endl;
	for(int i=mid+1;i<=r;i++)
	{
		while(x[p].b<=x[i].b && p<=mid)
		{
			update(x[p].c,1);
			p++;
		}
		//cout<<l<<" "<<p-1<<" "<<x[i].c<<" "<<query(x[i].c)<<endl;
		x[i].ans+=query(x[i].c);
	}
	for(int i=l;i<p;i++) update(x[i].c,-1);
	sort(x+l,x+r+1,cmpb);
}
int main()
{
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
	{
	    scanf("%d%d%d",&x[i].a,&x[i].b,&x[i].c);
	    x[i].ID=i;
	}
	sort(x+1,x+1+n,cmpa);
	get_ans(1,n);
	sort(x+1,x+1+n,cmpa);
	int p=1;
	//for(int i=1;i<=n;i++) printf("%d\n",x[i].ans);
	//printf("\n");
	for(int i=1;i<=n;i++)
	{
		p=max(p,i);
	    while(x[i].a==x[p].a && x[i].b==x[p].b && x[i].c==x[p].c && p<=n) p++;
	    p--;
	    x[i].ans=x[p].ans;
	}
	//for(int i=1;i<=n;i++) printf("%d\n",x[i].ans);
	//printf("\n");
	for(int i=1;i<=n;i++) sum[x[i].ans]++;
	for(int i=0;i<n;i++) printf("%d\n",sum[i]);
	return 0;
}
2021/7/24 18:50
加载中...