50pts求调
  • 板块P3950 部落冲突
  • 楼主luqyou
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/3/25 19:03
  • 上次更新2023/10/23 20:31:12
查看原帖
50pts求调
464732
luqyou楼主2023/3/25 19:03
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+10;
int n,q;
vector<int> G[maxn];
int col[maxn],dfn[maxn],id[maxn],fa[maxn],size[maxn],hson[maxn],deep[maxn],top[maxn],cnt,c[maxn];
int war[maxn];
void dfs1(int u,int father){
	size[u]=1;
	hson[u]=0;
	fa[u]=father;
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(v!=father) {
			deep[v]=deep[u]+1;
			dfs1(v,u);
			size[u]+=size[v];
			if(size[v]>size[hson[u]]){
				hson[u]=v;
			}
		}
	}
}
void dfs2(int u,int fa,int nowtop){
	dfn[++cnt]=u;
	id[u]=cnt;
	top[u]=nowtop;
	if(hson[u]){
		dfs2(hson[u],u,nowtop);
		for(int i=0;i<G[u].size();i++){
			int v=G[u][i];
			if(v!=fa&&v!=hson[u]){
				dfs2(v,u,v);
			}
		}
	}
}
void update(int x,int y){
	for(int i=x;i<=n;i+=(i&(-i))){
		c[i]+=y;
	}
}
int query(int x){
	int sum=0;
	for(int i=x;i;i-=(i&(-i))){
		sum+=c[i];
	}
	return sum;
}
int queryintree(int x,int y){
	int val2=0;
	while(top[x]!=top[y]) {
		if(deep[top[x]]<deep[top[y]])
			swap(x,y);
		val2=query(id[x])-query(id[top[x]]-1)+val2;
		x=fa[top[x]];
	}
	if(deep[x]<deep[y])
		swap(x,y);
	val2=query(id[y])-query(id[x])+val2;
	return val2;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>q;
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		G[u].push_back(v);
		G[v].push_back(u);
	}
	dfs1(1,0);
	dfs2(1,0,1);
	cnt=0;
	for(int i=1;i<=q;i++){
		char op;
		cin>>op;
		if(op=='Q'){
			int u,v,k;
			cin>>u>>v;
			k=queryintree(u,v);
			if(k!=-0){
				cout<<"No"<<endl;
			}
			else{
				cout<<"Yes"<<endl;
			}
		}
		if(op=='C'){
			int u,v;
			cin>>u>>v;
			if(id[u]<id[v]) swap(u,v);
			war[++cnt]=u;
			update(id[u],1);
		}
		if(op=='U'){
			int x,u,v;
			cin>>x;
			u=war[x];
			update(id[u],-1);
		}
	}
	return 0;
}
2023/3/25 19:03
加载中...