萌新刚学cdq分治,样例都没过求助
查看原帖
萌新刚学cdq分治,样例都没过求助
203008
山田リョウ楼主2021/10/18 23:58
#include<stdio.h>
#include<algorithm>
int f[100001],C[200001],n,cnt[100001];
struct{int a,b,c;}a[100001],b[100001];
int sum(int x){int ans=0;for(;x;x-=(x&-x))ans+=C[x];return ans;}
void ins(int x){for(;x<200001;x+=(x&-x))++C[x];}
void clear(int x){for(;x<200001;x+=(x&-x))C[x]=0;}
void cdq(int l,int r){
	if(l==r)return;
	int mid=l+r>>1;
	cdq(l,mid);cdq(mid+1,r);
	int i=l,j=mid+1,k=l;
	for(;i<=mid&&j<=r;++k){
		if(a[i].b<a[j].b)b[k]=a[i],ins(a[i++].c);
		else f[j]+=sum(a[j].c),b[k]=a[j++];
	}
	for(;i<=mid;b[k++]=a[i++]);
	for(;j<=r;b[k++]=a[j++])f[j]+=sum(a[j].c);
	for(i=l;i<=mid;++i)clear(a[i].c);
	for(i=l;i<=r;++i)a[i]=b[i];
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i)scanf("%d%d%d",&a[i].a,&a[i].b,&a[i].c);
	std::sort(a+1,a+n+1,[](const auto&x,const auto&y){return x.a<y.a;});
	cdq(1,n);
	for(int i=1;i<=n;++i)++cnt[f[i]];
	for(int i=0;i<n;++i)printf("%d\n",cnt[i]);
	return 0;
}

样例它居然输出:

7
0
0
0
0
3
0
0
0
0

2021/10/18 23:58
加载中...