求助,样例过了
查看原帖
求助,样例过了
297683
wYYSZLwSSY楼主2023/2/21 07:23

其实按理说会 TLE 几个点,但最小的都 WA。

#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x&(-x))
using namespace std;
int n,k;
int tree[200005];
int f[100006];
int ans[100005];
struct P{
	int a,b,c,i;
}p[100005],q[100005];
inline bool cmp(P x,P y){
	if(x.a==y.a){
		if(x.b==y.b) return x.c<y.c;
		return x.b<y.b;
	}
	return x.a<y.a;
}
void add(int x){
	for(;x<=k;x+=lowbit(x))++tree[x];
	return ;
}
int check(int x){
	int sum=0;
	for(;x>0;x-=lowbit(x))sum+=tree[x];
	return sum;
}
inline bool cmp3(P x,P y){
	if(x.b <y.b )return 1;
	if(x.b >y.b )return 0;
	return x.a >y.a ;
}
void merge(int l,int r){
	if(l==r)return ;
	if(r<l)return ;
	int mid=(l+r)/2;
	merge(l,mid);
	merge(mid+1,r);
	for(int i=0;i<=k;++i){
		tree[i]=0;
	}
	for(int i=l;i<=r;++i){
		q[i].b =p[i].b ;
		q[i].c =p[i].c ;
		q[i].a =(i<=mid?1:0);
		q[i].i =p[i].i ;
	}
	sort(q+l,q+r+1,cmp3);
	for(int i=l;i<=r;++i){
		if(q[i].a )add(q[i].c );
		else f[q[i].i ]+=check(q[i].c );
	}
	return ;
}
signed main(){
	ios::sync_with_stdio(0);
	cin>>n>>k;
	for(int i=1;i<=n;++i){
		cin>>p[i].a>>p[i].b >>p[i].c ;
		p[i].i =i;
	}
	sort(p+1,p+n+1,cmp);
	merge(1,n);
	for(int i=1;i<=n;++i){
		++ans[f[i]];
	}
	for(int i=0;i<n;++i){
		cout<<ans[i]<<endl;
	}
	return 0;
}


2023/2/21 07:23
加载中...