萌新第一次写cdq分治求助
查看原帖
萌新第一次写cdq分治求助
113521
muyang_233楼主2020/7/8 17:28

RT,应该是cdq分治那个地方写错了,但是查不出来/kk

#include <cstdio>
#include <algorithm>
using namespace std;
struct node{
	int a,b,c;
}p[100005],q[100005];
int n,k;
int t[100005];
int s[100005],ans[100005];
bool cmp(node _1,node _2){
	return _1.a<_2.a;
}
int lowbit(int x){
	return x&(-x);
}
void update(int x,int v){
	for (int i=x;i<=n;i+=lowbit(i)){
		s[i]+=v;
	}
}
int query(int x){
	int sum=0;
	for (int i=x;i>0;i-=lowbit(i)){
		sum+=s[i];
	}
	return sum;
}
void CDQ(int l,int r){
	if (l==r){
		return;
	}
	int mid=(l+r)>>1;
	CDQ(l,mid);
	CDQ(mid+1,r);
	int _1=l,_2=mid+1,cnt=0;
	while(_1<=mid&&_2<=r){
		if (p[_1].b<=p[_2].b){
			q[++cnt]=p[_1];
			update(p[_1].c,1);
			_1++;
		}
		else{
			q[++cnt]=p[_2];
			ans[_2]+=query(p[_2].c);
			_2++;
		}
	}
	while(_1<=mid){
		q[++cnt]=p[_1];
		update(p[_1].c,1);
		_1++;	
	}
	while(_2<=r){
		q[++cnt]=p[_2];
		ans[_2]+=query(p[_2].c);
		_2++;
	}
	for (int i=l;i<=mid;i++){
		update(p[i].c,-1);
	}
	for (int i=1;i<=cnt;i++){
		p[l+i-1]=q[i];
	}
}
int main(){
	scanf("%d%d",&n,&k);
	for (int i=1;i<=n;i++){
		scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].c);
	}
	sort(p+1,p+n+1,cmp);
	CDQ(1,n);
	for (int i=1;i<=n;i++){
		++t[ans[i]];
	}
	for (int i=0;i<n;i++){
		printf("%d\n",t[i]);
	}
	return 0;
}

2020/7/8 17:28
加载中...