wa on 4怎么办
查看原帖
wa on 4怎么办
678673
Sio_楼主2023/9/2 15:34

rt

#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
int n,m,del[maxn],siz[maxn],ctr,dep[maxn],dp[maxn][20],f[maxn],val1[maxn],val2[maxn],vis[maxn],sum;
vector<int> nbr[maxn];
multiset<int> a[maxn],b[maxn],c; 
void dfs(int cur,int fa)
{
	int maxi=0;siz[cur]=1;
	for(int i=0;i<nbr[cur].size();i++)
	{
		int nxt=nbr[cur][i];
		if(del[nxt]==1||fa==nxt) continue;
		dfs(nxt,cur);
		if(ctr!=-1) return;
		siz[cur]+=siz[nxt],maxi=max(maxi,siz[nxt]);
	}
	maxi=max(maxi,n-siz[cur]);
	if(maxi<=(n>>1)) ctr=cur,siz[fa]=n-siz[cur];
}
inline void run(int p)
{
	del[p]=1;
	for(int i=0;i<nbr[p].size();i++)
	{
		int nxt=nbr[p][i];
		if(del[nxt]==1) continue;
		n=siz[nxt],ctr=-1;
		dfs(nxt,0);
		f[ctr]=p;
		run(ctr);
	}
}
void dfs2(int cur,int fa)
{
	dep[cur]=dep[fa]+1,dp[cur][0]=fa;
	for(int j=1;j<=18;j++) dp[cur][j]=dp[dp[cur][j-1]][j-1];
	for(int i=0;i<nbr[cur].size();i++)
	{
		int nxt=nbr[cur][i];
		if(fa==nxt) continue;
		dfs2(nxt,cur);
	}
}
inline int lca(int x,int y)
{
	if(dep[x]>dep[y]) swap(x,y);
	for(int i=18;i>=0;i--) if(dep[dp[y][i]]>=dep[x]) y=dp[y][i];
	if(x==y) return x;
	for(int i=18;i>=0;i--) if(dp[x][i]!=dp[y][i]) x=dp[x][i],y=dp[y][i];
	return dp[x][0];
}
inline int dis(int x,int y){return dep[x]+dep[y]-2*dep[lca(x,y)];}
inline void insert(int cur)
{
	int x=cur;
	while(f[x]!=0)
	{
		a[x].insert(dis(f[x],cur));
		c.erase(c.find(val2[f[x]]));
		b[f[x]].erase(b[f[x]].find(val1[x]));
		val1[x]=*a[x].rbegin();
		b[f[x]].insert(val1[x]);
		int tmp1=*b[f[x]].rbegin(),tmp2;
		b[f[x]].erase(b[f[x]].find(tmp1));
		tmp2=*b[f[x]].rbegin();
		b[f[x]].insert(tmp1);
		c.insert(tmp1+tmp2);
		val2[f[x]]=tmp1+tmp2;
		x=f[x];
	}
}
inline void delet(int cur)
{
	int x=cur;
	while(f[x]!=0)
	{
		a[x].erase(a[x].find(dis(f[x],cur)));
		c.erase(c.find(val2[f[x]]));
		b[f[x]].erase(b[f[x]].find(val1[x]));
		val1[x]=*a[x].rbegin();
		b[f[x]].insert(val1[x]);
		int tmp1=*b[f[x]].rbegin(),tmp2;
		b[f[x]].erase(b[f[x]].find(tmp1));
		tmp2=*b[f[x]].rbegin();
		b[f[x]].insert(tmp1);
		c.insert(tmp1+tmp2);
		val2[f[x]]=tmp1+tmp2;
		x=f[x];
	}
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
    cin>>n;
    int tmp=n;
    for(int i=1;i<n;i++)
    {
    	int u,v;
    	cin>>u>>v;
    	nbr[u].push_back(v),nbr[v].push_back(u);
	}
	dfs2(1,0);
	ctr=-1;
	dfs(1,0);
	run(ctr);
	n=tmp;
	for(int i=1;i<=n;i++) a[i].insert(0),b[f[i]].insert(0),b[f[i]].insert(0),b[i].insert(0),c.insert(0);
	for(int i=1;i<=n;i++) insert(i);
	cin>>m;
	sum=n;
	while(m--)
	{
		char opt;int x;
		cin>>opt;
		if(opt=='G')
		{
			if(sum==0) cout<<"-1\n";
			else if(sum==1) cout<<"0\n";
			else cout<<(*c.rbegin())<<"\n";
		}
		else
		{
			cin>>x;
			if(vis[x]==0){vis[x]=1;sum--;delet(x);}
			else{vis[x]=0;sum++;insert(x);}
		}
	}
}
2023/9/2 15:34
加载中...