求助,动态点分治wa2,4
查看原帖
求助,动态点分治wa2,4
126321
eexyz楼主2021/1/7 17:26
#include<bits/stdc++.h>
using namespace std;
#define N 100005
#define pb push_back
#define S son[now].size()
#define chk ((!vst[T=son[now][i]])&&(T!=fat))
vector<int>son[N],to[N];
#define getc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;
char buf[1<<21],*p1,*p2,cha;
int ret;
inline int re() {
    ret=0;
    cha=getc();
    while(!isdigit(cha)){
        cha=getc();
    }
    while(isdigit(cha)){
        ret=(ret<<1)+(ret<<3)+(cha^48);
        cha=getc();
    }
    return ret;
}
inline char rech(){
	cha=getc();
	while(cha<'A'||cha>'Z')cha=getc();
	return cha;
}
typedef struct dui{
	priority_queue<int>p,d;int size;
	int get1(){
		while(d.size()&&p.top()==d.top())p.pop(),d.pop();
		return p.top();
	}int ins(int x){p.push(x);++size;}
	int rem(int x){if(p.top()==x)p.pop();else d.push(x);--size;}
	int ans(){
		int f1=get1(),f2;p.pop();f2=get1();
		p.push(f1);return f1+f2;
	}
	int CH1(){return size>1;}
	int CH0(){return size;}
}dui;
dui qj,f[N],ch[N];
int DD_max,fa[N][20],is[N],frm[N][20],dep[N],vst[N],Son[N],size[N],SIZ,root,FA[N],top[N];
char opt;
void cp_dfs(int now,int fat){
	dep[now]=dep[fat]+1;size[now]=1;FA[now]=fat;
	for(int T,i=0;i<S;++i)if((T=son[now][i])!=fat)
		cp_dfs(T,now),size[now]+=size[T],(size[T]>size[Son[now]])&&(Son[now]=T);
}
void cp_dfs0(int now,int tp){
	top[now]=tp;if(Son[now])cp_dfs0(Son[now],tp); 
	for(int T,i=0;i<S;++i)if((T=son[now][i])!=FA[now]&&T!=Son[now])cp_dfs0(T,T);
}
void pre(int now,int fat){
	size[now]=1; 
	for(int T,i=0;i<S;++i)
		if(chk)pre(T,now),size[now]+=size[T];
}
void rt(int now,int fat){
	int i=0,T,mx=SIZ-size[now];
	for(;i<S;++i)
		if(chk)rt(T,now),mx=max(mx,size[T]);
	if(mx<=(SIZ>>1))root=now;
}
void dfs0(int FAT,int DD,int rt,int now,int fat,int dep){
	ch[rt].ins(dep),++dep;frm[now][DD]=rt;fa[now][DD]=FAT;
	for(int T,i=0;i<son[now].size();++i)
		if(chk)dfs0(FAT,DD,rt,T,now,dep);
}
int dis(int x,int y){
	int ans=dep[x]+dep[y];
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		x=FA[top[x]];
	}
	if(dep[x]>dep[y])return ans-2*dep[y];
	return ans-dep[x]*2;
}
void dfs(int DD,int now){
	rt(now,0);now=root;vst[now]=1;
	pre(now,0);
	for(int T,i=0;i<son[now].size();++i)
		if(!vst[T=son[now][i]])
			dfs0(now,DD,T,T,0,1),f[now].ins(ch[T].get1()),SIZ=size[T],dfs(DD+1,T);
	f[now].ins(0);if(f[now].CH1())qj.ins(f[now].ans());
}int n,i,x,y,m,X,gb,y_;
int main(){
//	freopen("aa.txt","r",stdin);
//	freopen("a.out","w",stdout);
	for(n=re(),i=1;i<n;++i)x=re(),y=re(),son[x].pb(y),son[y].pb(x);
	SIZ=n;pre(1,0);dfs(0,1);cp_dfs(1,0);cp_dfs0(1,1);
	m=re();gb=n;while(m--){
		if(rech()=='C'){
			x=re();X=0;
			if(!is[x]){
				--gb;is[x]=1;
				if(f[x].CH1())qj.rem(f[x].ans());
				f[x].rem(0);
				if(f[x].CH1())qj.ins(f[x].ans());
				for(;fa[x][X];++X){
					y=fa[x][X];y_=frm[x][X];
					if(f[y].CH1())qj.rem(f[y].ans());
					if(ch[y_].CH0())f[y].rem(ch[y_].get1());
					ch[y_].rem(dis(x,y_)+1);
					if(ch[y_].CH0())f[y].ins(ch[y_].get1());
					if(f[y].CH1())qj.ins(f[y].ans());
				}
			}
			else{
				++gb;is[x]=0;
				if(f[x].CH1())qj.rem(f[x].ans());
				f[x].ins(0);
				if(f[x].CH1())qj.ins(f[x].ans());
				for(;fa[x][X];++X){
					y=fa[x][X];y_=frm[x][X];
					if(f[y].CH1())qj.rem(f[y].ans());
					if(ch[y_].CH0())f[y].rem(ch[y_].get1());
					ch[y_].ins(dis(x,y_)+1);
					if(ch[y_].CH0())f[y].ins(ch[y_].get1());
					if(f[y].CH1())qj.ins(f[y].ans());
				}
			}
		}
		else{
			if(!gb)puts("-1");
			else if(gb==1)puts("0");
			else printf("%d\n",qj.get1());
		}
	} 
}
2021/1/7 17:26
加载中...