树套树 WA 10pts 求条
查看原帖
树套树 WA 10pts 求条
1367000
Ybll_楼主2025/7/22 10:41
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,M=2e5+5;
struct Segment_Tree
{
	int ls,rs,sum;
}tree[M*100];
struct node
{
	int x,y,z;
	bool operator<(node i)const
	{
		return x!=i.x?x<i.x:y!=i.y?y<i.y:z<i.z;
	}
	bool operator==(node i)const
	{
		return x==i.x&&y==i.y&&z==i.z;
	}
}a[N];
int ans[N],cnt,root[M*4],n,k;
void push_up(int id)
{
	tree[id].sum=tree[tree[id].ls].sum+tree[tree[id].rs].sum;
}
void sed_update(int id,int l,int r,int p,int sum)
{
	if(l==r)
	{
		tree[id].sum+=sum;
		return;
	}
	int mid=l+r>>1;
	if(p<=mid)
	{
		if(tree[id].ls==0)tree[id].ls=++cnt;
		sed_update(tree[id].ls,l,mid,p,sum);
	}
	else
	{
		if(tree[id].rs==0)tree[id].rs=++cnt;
		sed_update(tree[id].rs,mid+1,r,p,sum);
	}
	push_up(id);
}
void fst_update(int id,int l,int r,int p,int v,int sum)
{
	if(r<p||l>p)return;
	if(root[id]==0)root[id]=++cnt;
	sed_update(root[id],1,k,v,sum);
	if(l==r)return;
	int mid=l+r>>1;
	fst_update(id*2,l,mid,p,v,sum);
	fst_update(id*2+1,mid+1,r,p,v,sum);
}
int sed_query(int id,int l,int r,int ql,int qr)
{
	if(l>ql||r<ql||id==0)return 0;
	if(l>=ql&&r<=qr)return tree[id].sum;
	int mid=l+r>>1;
	return sed_query(tree[id].ls,l,mid,ql,qr)+sed_query(tree[id].rs,mid+1,r,ql,qr);
}
int fst_query(int id,int l,int r,int fl,int fr,int sl,int sr)
{
	if(l>fr||r<fl)return 0;
	if(l>=fl&&r<=fr)return sed_query(root[id],1,k,sl,sr);
	int mid=l+r>>1;
	return fst_query(id*2,l,mid,fl,fr,sl,sr)+fst_query(id*2+1,mid+1,r,fl,fr,sl,sr);
}
signed main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].x>>a[i].y>>a[i].z;
	}
	sort(a+1,a+1+n);
	for(int i=1,j=1;i<=n;i++)
	{
		if(a[i]==a[i+1])
		{
			j++;
			continue;
		}
		fst_update(1,1,k,a[i].y,a[i].z,j);
		ans[fst_query(1,1,k,1,a[i].y,1,a[i].z)-1]+=j;
		j=1;
	}
	for(int i=0;i<n;i++)
	{
		cout<<ans[i]<<"\n";
	}
	return 0;
}
2025/7/22 10:41
加载中...