CDQ 玄关求调
查看原帖
CDQ 玄关求调
762117
快速数论变换楼主2025/7/19 08:30

不过样例,全WA

#include<bits/stdc++.h>
using namespace std;
struct _{
	int a,b,c,id;
	_()=default;
	_(int a,int b,int c,int id):a(a),b(b),c(c),id(id){}
};
constexpr int K=2e5+3,N=2e5+3;
int bit[K],n,k,cnt[N],ans[N];
inline int lowbit(int qwq){return qwq&-qwq;}
inline void add(int pos,int val){
	for(int i=pos;i<=k;i+=lowbit(i)) bit[i]+=val;
	return;
}
inline int query(int pos){
	int res=0;
	for(int i=pos;i;i-=lowbit(i)) res+=bit[i];
	return res;
}
void solve(int l,int r,_* t){
	if(l==r) return;
	int mid=(l+r)>>1;
	sort(t+l,t+mid+1,[](const _& x,const _& y)->bool{
		return x.b<y.b;
	});
	sort(t+mid+1,t+r+1,[](const _& x,const _& y)->bool{
		return x.b<y.b;
	});
	int ptr=l;
	for(int i=mid+1;i<=r;++i){
		while(t[ptr].b<=t[i].b&&ptr<=mid) add(t[ptr++].c,1);
		ans[t[i].id]+=query(t[i].c);
	}
	for(int i=l;i<ptr;++i) add(t[i].c,-1);
	solve(l,mid,t),solve(mid+1,r,t);
	return;
}
signed main(){
	ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
	cin>>n>>k;
	_ t[n+1];
	for(int i=1,a,b,c;i<=n;++i) cin>>a>>b>>c,t[i]=_(a,b,c,i);
	sort(t+1,t+1+n,[](const _& x,const _& y)->bool{
		if(x.a!=y.a) return x.a<y.a;
		if(x.b!=y.b) return x.b<y.b;
		return x.c<y.c;
	});
	for(int i=1,j,s;i<=n;i=j){
		j=i;
		while(j<=n&&t[j].a==t[i].a&&t[j].b==t[i].b&&t[j].c==t[i].c) ++j;
		s=j-i;
		for(int p=0;p<s;++p) ans[t[i+p].id]+=p;
	}
	solve(1,n,t);
	for(int i=1;i<=n;++i) ++cnt[ans[i]];
	for(int i=0;i<n;++i) cout<<cnt[i]<<'\n';
	return 0;
}
2025/7/19 08:30
加载中...