抽象马蜂求条
查看原帖
抽象马蜂求条
1083200
guojiahong楼主2025/2/4 23:16
#include<bits/stdc++.h>
using namespace std;
vector<int> to[100001],s[100001];
struct question{
	int c;
	vector<int> q; 
}_[100001];
bool cmp(question _1,question _2){return _1.c>_2.c;}
int d[200001],now;
bool vis[100001],vis1[100001];
pair<int,int> p[100001];
void dfs(int u,int shen)
{
	vis1[u]=1;
	d[++now]=u;
	p[u].first=now;
	s[shen].push_back(now);
	int len=to[u].size();
	for(int i=0;i<len;i++)if(!vis1[to[u][i]])dfs(to[u][i],shen+1);
	d[++now]=u;
	p[u].second=now;
}
int tree[800001];
void change(int node,int l,int r,int w)
{
	if(l==r)
	{
		vis[l]=1;
		tree[node]=1;
		return ;
	}
	int mid=(l+r)/2;
	if(w<=mid)change(node*2,l,mid,w);
	else change(node*2+1,mid+1,r,w);
	tree[node]=tree[node*2]+tree[node*2+1];
	return ;
} 
int get(int node,int l,int r,int ll,int rr)
{
	if(l>=ll&&r<=rr)return tree[node];
	int mid=(l+r)/2;
	int cnt=0;
	if(ll<=mid)cnt+=get(node*2,l,mid,ll,rr);
	if(rr>mid)cnt+=get(node*2+1,mid+1,r,ll,rr);
	return cnt;
}
int main(){
	freopen("tree2.in","r",stdin); 
	freopen("tree.out","w",stdout); 
	int n,m;
	scanf("%d%d",&n,&m);
	int u,v;
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&u,&v);
		to[u].push_back(v);
		to[v].push_back(u);
	}
	int op,x,cnt=0;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&op,&x);
		if(op==1)_[++cnt].c=x;
		else _[cnt].q.push_back(x);
	}
	sort(_+1,_+1+cnt,cmp);
	dfs(1,1);
	for(int i=1;i<=cnt;i++)
	{
		int len=s[_[i].c].size();
		for(int j=0;j<len;j++)
		{
			int k=s[_[i].c][j];
			if(vis[k])break;
			while(k<=p[d[s[_[i].c][j]]].second)
			{
				change(1,1,2*n,k);
				if(vis[k+1])k=p[d[k]].second;
				else k++;
			}
		}
		int qlen=_[i].q.size();
		for(int j=0;j<qlen;j++)
		{
//			cout<<p[_[i].q[j]].first<<' '<<p[_[i].q[j]].second<<'\n';
			printf("%d\n",get(1,1,2*n,p[_[i].q[j]].first,p[_[i].q[j]].second)/2);
		}
	} 
	return 0;
}
2025/2/4 23:16
加载中...