CDQ套CDQ没过样例
查看原帖
CDQ套CDQ没过样例
649108
Shanganze楼主2023/3/21 18:31
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+1;
struct a1{
	int a,b,c,ans,cnt,k;
}xx[N],x[N],b[N],c[N];
int n,m,shu[N];
bool aa(a1 a,a1 b){
	if(a.a==b.a){
		if(a.b==b.b)return a.c<b.c;
		return a.b<b.b; 
	}
	return a.a<b.a;
}
int ans[N];
void CDQ2(int l,int r){
	int mid=(l+r)>>1;
	if(l==r)return ;
	CDQ2(l,mid);CDQ2(mid+1,r);
	int cnt=0;
	for(int i=l,j=l,q=mid+1;i<=r;i++){
		if((q>r||b[j].c<=b[q].c)&&j<=mid){
			c[i]=b[j++];
			if(c[i].k!=0)cnt+=c[i].cnt;
		}
		else {
			c[i]=b[q++];
			if(!c[i].k){
				c[i].ans+=cnt;
			}
		}
	}
	for(int q=l;q<=r;q++)b[q]=c[q];
}
void CDQ(int l,int r){
	int mid=(l+r)>>1;
	if(l==r)return ;
	CDQ(l,mid);CDQ(mid+1,r);
	for(int i=l,j=l,q=mid+1;i<=r;i++){
		if(q>r){
			b[i]=x[j++];b[i].k=1;
		}
		else if(x[j].b<=x[q].b&&j<=mid){
			if(x[j].b==x[q].b&&x[j].c>x[q].c){
				b[i]=x[q++];b[i].k=0;
			}
			else b[i]=x[j++];b[i].k=1;
		}
		else {
			b[i]=x[q++];b[i].k=0;
		}
	}
	for(int q=l;q<=r;q++)x[q]=b[q];
	CDQ2(l,r);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int q=1;q<=n;q++){
		scanf("%d%d%d",&xx[q].a,&xx[q].b,&xx[q].c);
	}
	sort(xx+1,xx+1+n,aa);
	int p=0,i=0;
	for(int q=1;q<=n;q++){
		p++;
		if(xx[q].a!=xx[q+1].a||xx[q].b!=xx[q+1].b||xx[q].c!=xx[q+1].c){
			x[++i]=xx[q];
			x[i].cnt=p;x[i].ans=0;
			p=0;
		}
	}
	CDQ(1,i);
	for(int q=1;q<=i;q++){
//		cout<<x[q].ans<<" ";
		ans[x[q].ans+x[q].cnt-1]+=x[q].cnt;
	}
	for(int q=0;q<n;q++){
		cout<<ans[q]<<"\n";
	}
	return 0;
}
2023/3/21 18:31
加载中...