求助卡常
查看原帖
求助卡常
380019
xieyikai2333楼主2022/7/21 18:41
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int d[N],dfn[N],sz[N],g[N],f[N],h[N],lg[N<<1],st[N<<1][20],vis[N],light[N],rt,all,en=0,tot=0;
struct edge
{
	int to,nxt;
}e[N<<1];
struct node
{
	priority_queue<int> x,y;
	inline void push(int v)
	{
		x.push(v);
		return;
	}
	inline void del(int v)
	{
		y.push(v);
		return;
	}
	inline int size()
	{
		return x.size()-y.size();
	}
	inline int fir()
	{
		while(!y.empty()&&x.top()==y.top())x.pop(),y.pop();
		return x.top();
	}
	inline int sec()
	{
		int tmp=fir();
		x.pop();
		int res=fir();
		x.push(tmp);
		return res;
	}
}A,B[N],C[N];
inline int read_d()
{
	int x=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return x;
}
inline char read_c()
{
	char ch=getchar();
	while(ch!='C'&&ch!='G')ch=getchar();
	return ch;
}
void write(int x)
{
	if(!x)return;
	write(x/10);
	putchar(x%10+'0');
	return;
}
inline void add(int u,int v)
{
	e[++en]=(edge){v,h[u]};
	h[u]=en;
	return;
}
void dfs(int u,int fa)
{
	dfn[u]=++tot;
	d[u]=d[fa]+1;
	st[tot][0]=d[u];
	for(int i=h[u];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(v==fa)continue;
		dfs(v,u);
		st[++tot][0]=d[u];
	}
	return;
}
inline void init()
{
	for(int i=2;i<=tot;i++)lg[i]=lg[i>>1]+1;
	for(int j=1;j<=lg[tot];j++)for(int i=1;i+(1<<j)-1<=tot;i++)st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
	return;
}
void get_rt(int u,int fa)
{
	sz[u]=1,g[u]=0;
	for(int i=h[u];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(v==fa||vis[v])continue;
		get_rt(v,u);
		sz[u]+=sz[v];
		g[u]=max(g[u],sz[v]);
	}
	g[u]=max(g[u],all-sz[u]);
	if(!rt||g[u]<g[rt])rt=u;
	return;
}
inline int d_lca(int u,int v)
{
	int x=dfn[u],y=dfn[v];
	if(x>y)swap(x,y);
	int k=lg[y-x+1];
	return min(st[x][k],st[y-(1<<k)+1][k]);
}
inline int dis(int u,int v)
{
	return d[u]+d[v]-2*d_lca(u,v);
}
void calc(int u,int fa)
{
	C[rt].push(dis(u,f[rt]));
	sz[u]=1;
	for(int i=h[u];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(v==fa||vis[v])continue;
		calc(v,u);
		sz[u]+=sz[v];
	}
	return;
}
inline void pushA(int u)
{
	if(B[u].size()>=2)A.push(B[u].fir()+B[u].sec());
	return;
}
inline void delA(int u)
{
	if(B[u].size()>=2)A.del(B[u].fir()+B[u].sec());
	return;
}
void build(int u)
{
	vis[u]=true;
	B[u].push(0);
	calc(u,0);
	for(int i=h[u];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(vis[v])continue;
		rt=0,all=sz[v];
		get_rt(v,0);
		v=rt;
		f[v]=u;
		build(v);
		B[u].push(C[v].fir());
	}
	pushA(u);
	return;
}
inline void ON(int x)
{
	delA(x);
	B[x].del(0);
	pushA(x);
	for(int i=x;f[i];i=f[i])
	{
		delA(f[i]);
		B[f[i]].del(C[i].fir());
		C[i].del(dis(x,f[i]));
		if(C[i].size())B[f[i]].push(C[i].fir());
		pushA(f[i]);
	}
	return;
}
inline void OFF(int x)
{
	delA(x);
	B[x].push(0);
	pushA(x);
	for(int i=x;f[i];i=f[i])
	{
		delA(f[i]);
		if(C[i].size())B[f[i]].del(C[i].fir());
		C[i].push(dis(x,f[i]));
		B[f[i]].push(C[i].fir());
		pushA(f[i]);
	}
	return;
}
int main()
{
	int n=read_d();
	int off=n;
	for(int i=1;i<n;i++)
	{
		int u,v;
		u=read_d(),v=read_d();
		add(u,v);
		add(v,u);
	}
	dfs(1,0);
	init();
	rt=0,all=n;
	get_rt(1,0);
	build(rt);
	int q=read_d();
	while(q--)
	{
		char op=read_c();
		if(op=='C')
		{
			int x=read_d();
			if(light[x])OFF(x),off++;
			else ON(x),off--;
			light[x]^=1;
		}
		else
		{
			if(off==0)puts("-1");
			else if(off==1)puts("0");
			else write(A.fir()),putchar('\n');
		}
	}
	return 0;
}
2022/7/21 18:41
加载中...