80分求助
查看原帖
80分求助
389540
imfkwk楼主2021/9/19 00:16
#include<bits/stdc++.h>
using namespace std;
inline void read(int&x){
	x=0;bool f=1;char ch=getchar();
	while(ch<48||ch>57){f=!(ch==45);ch=getchar();}
	while(ch>=48&&ch<=57){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	x=f?x:-x;
}
int n,k,tr[200001],q[100001];
struct node{
	int num,a,b,c,w,ans;
};
node f[100001];int cnt;
inline void add(int x,int k){
	while(x<=n){
		tr[x]+=k;
		x+=x&-x;
	}
}
inline int query(int x){
	int ans=0;
	while(x){
		ans+=tr[x];
		x-=x&-x;
	}
	return ans;
}
bool cmp1(node x,node y){return x.a<y.a||x.a==y.a&&x.b<y.b||x.a==y.a&&x.b==y.b&&x.c<y.c;}
bool cmp2(node x,node y){return x.b<y.b;}
void solve(int L,int R){
	if(L==R)return;
	int mid=(L+R)/2,i,p;
	solve(L,mid);
	solve(mid+1,R);
	sort(f+L,f+mid+1,cmp2);
	sort(f+mid+1,f+R+1,cmp2);
	for(p=L,i=mid+1;i<=R;++i){
		while(p<=mid&&f[p].b<=f[i].b){
			add(f[p].c,f[p].w);++p;
		}
		f[i].ans+=query(f[i].c);
	}
	for(i=L;i<p;++i){
		add(f[i].c,-f[i].w);
	}
}
signed main(void){
	read(n);read(k);int i;
	for(i=1;i<=n;++i){
		read(f[i].a);read(f[i].b);read(f[i].c);
		f[i].num=i;
	}
	sort(f+1,f+n+1,cmp1);f[1].w=1;
	for(i=2,cnt=1;i<=n;++i){
		if(f[i].a==f[i-1].a&&f[i].b==f[i-1].b&&f[i].c==f[i-1].c){
			++f[cnt].w;
		}else{
			f[++cnt]=f[i];
			f[cnt].w=1;
		}
	}
	solve(1,cnt);
	for(i=1;i<=cnt;++i){
		q[f[i].ans+f[i].w-1]+=f[i].w;
	}
	for(i=0;i<n;++i)
		printf("%d\n",q[i]);
	return 0;
}

Sub7和Sub10WA掉了。

2021/9/19 00:16
加载中...