30pts,求调
查看原帖
30pts,求调
327295
GalwayGirl楼主2022/10/12 20:55
#include<bits/stdc++.h>
using namespace std;
const int N=310000;
int n,size[N],son[N],top[N],dfn[N],deep[N],f[N],cnt,q,tot,zuo[N],you[N],c,head[N];
struct xzh{
	int next,to;
}edge[2*N];
struct hh{
	int l,r,sum;
}tree[4*N];
void build(int p,int l,int r){
	tree[p].l=l;tree[p].r=r;
	if(l==r)return;
	int mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
}
void add(int u,int v){
	c++;
	edge[c].next=head[u];
	edge[c].to=v;
	head[u]=c;
}
void dfs1(int now,int fa){
	size[now]=1;
	for(int i=head[now];i;i=edge[i].next){
		int v=edge[i].to;
		if(v!=fa){
			deep[v]=deep[now]+1;
			f[v]=now;
			dfs1(v,now);
			size[now]+=size[v];
			if(size[v]>size[son[now]])son[now]=v;
		}
	}
}
void dfs2(int now,int topp){
	cnt++;
	dfn[now]=cnt;
	top[now]=topp;
	if(!son[now])return;
	dfs2(son[now],topp);
	for(int i=head[now];i;i=edge[i].next){
		int v=edge[i].to;
		if(!dfn[v])
			dfs2(v,v);
	}
}
void change(int p,int x,int d){
	if(tree[p].l==tree[p].r){
		tree[p].sum+=d;
		return;
	}
	int mid=(tree[p].l+tree[p].r)/2;
	if(x<=mid)change(p*2,x,d);
	else change(p*2+1,x,d);
	tree[p].sum=tree[p*2].sum+tree[p*2+1].sum;
}
int ask(int p,int l,int r){
	if(l<=tree[p].l&&tree[p].r<=r)return tree[p].sum;
	int ans=0;
	int mid=(tree[p].l+tree[p].r)/2;
	if(l<=mid)ans+=ask(p*2,l,r);
	if(r>mid)ans+=ask(p*2+1,l,r);
	return ans;
}
int sum(int x,int y){
	int ans=0;
	if(top[x]!=top[y]){
		if(deep[top[x]]<deep[top[y]])swap(x,y);
		ans+=ask(1,dfn[top[x]],dfn[x]);
		x=f[top[x]];
	}
	if(deep[x]>deep[y])swap(x,y);
	ans+=ask(1,dfn[x]+1,dfn[y]);
	return ans;
}
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<n;i++){
		int u,v;
		scanf("%d%d",&u,&v);		
		add(u,v);
		add(v,u);
	}
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n);
	while(q--){
		char op;int x,y;
		cin>>op;
		scanf("%d",&x);
		if(op=='C'){
			scanf("%d",&y);
			tot++;zuo[tot]=x;you[tot]=y;
			if(f[y]==x)swap(x,y);
			change(1,dfn[x],1);
		}
		else if(op=='Q'){
			scanf("%d",&y);
			if(!sum(x,y))printf("Yes\n");
			else printf("No\n");
		} 
		else {
			if(f[zuo[x]]==you[x])change(1,dfn[zuo[x]],-1);
			else change(1,dfn[you[x]],-1);
		}
	}
	return 0;
}
2022/10/12 20:55
加载中...