帮调代码
查看原帖
帮调代码
816200
Staggered楼主2025/8/5 15:40
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k;
struct node
{
	int s,c,m,sum,id;
}a[500005],e[500005];
int ans[500005],res[500005];
int cnt=0;
bool cmp(node xx,node yy)
{
	if(xx.s!=yy.s) return xx.s<yy.s;
	if(xx.c!=yy.c) return xx.c<yy.c;
	if(xx.m!=yy.m) return xx.m<yy.m;
}
bool cmp2(node xx,node yy){
	if(xx.c==yy.c) return xx.m<yy.m;
	return xx.c<yy.c;
}
int tree[500005];
void add(int x,int c)
{
	for(;x<=400005;x+=x&-x) tree[x]+=c; 
}
int query(int x)
{
	int res=0;
	for(;x;x-=x&-x) res+=tree[x];
	return res;
}
void Cdq(int l,int r)
{
	if(l==r) return ;
	int mid=(l+r)>>1;
	Cdq(l,mid);Cdq(mid+1,r);
	sort(e+l,e+1+mid,cmp2);sort(e+mid+1,e+1+r,cmp2);
	int ll=l,rr=mid+1;
	while(ll<=mid||rr<=r)
	{
		if(ll<=mid&&(rr>r||e[ll].c<=e[rr].c))
		{
			add(e[ll].m,e[ll].sum);
			ll++;
		}
		else
		{
			ans[e[rr].id]+=query(e[rr].m);
			rr++;
		}
	}
	for(int i=l;i<=mid;i++) add(e[i].m,-e[i].sum);
}
signed main()
{
//	freopen("SJ.in","r",stdin);
	scanf("%lld%lld",&n,&k);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld%lld%lld",&a[i].s,&a[i].c,&a[i].m); 
	}
	sort(a+1,a+1+n,cmp);
	int j=0;
	for(int i=1;i<=n;i=j+1)
	{
		j++;node lst=a[i];
		e[++cnt]=a[i];
		while(a[j+1].s==lst.s&&a[j+1].c==lst.c&&a[j+1].m==lst.m&&j+1<=n) j++;
		e[cnt].sum=j-i+1;
		e[cnt].id=cnt;
	}
	Cdq(1,cnt);
	for(int i=1;i<=cnt;i++)
		res[ans[i]+e[i].sum-1]+=e[i].sum;
	for(int i=0;i<n;i++) printf("%lld\n",res[i]);
	return 0;
}
2025/8/5 15:40
加载中...