太难打了…
先弃掉
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define INF (int)(1e9)
using namespace std;
priority_queue<int> fl,f2,f3;//f1:到当前根的距离,f2:儿子的f1的值,f3:f2的最大值与次大值之和
int n,m,len=0,cnt;//cnt:当前关灯的数目
int last[200010],size[200010],msize[200010],dis[200010],sum[200010],f[200010][25],dep[200010],fa[200010];
bool state[200010],bz[200010];
struct node{int x,y,next;} a[200010];
int SIZE,ROOT,FA;
void ins(int x,int y)
{
a[++len]=(node){x,y,last[x]}; last[x]=len;
}
void init()
{
for(int i=1;i<=20;i++)
for(int j=1;j<=n;j++)
f[j][i]=f[f[j][i-1]][i-1];
}
int op=0;
void dfs_pre(int x,int fa)
{
for(int i=last[x];i;i=a[i].next)
{
int y=a[i].y;
if(y==fa) continue;
f[y][0]=x;
dep[y]=dep[x]+1;
dfs_pre(y,x);
}
}
int lca(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
for(int i=20;i>=0;i--)
if(dep[y]<=dep[f[x][i]]) x=f[x][i];
if(x==y) return x;
for(int i=20;i>=0;i--)
if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
return f[x][0];
}
void find_root(int x,int fa)
{
size[x]=1;
msize[x]=0;
for(int i=last[x];i;i=a[i].next)
{
int y=a[i].y;
if(y==fa||bz[y]) continue;
find_root(y,x);
size[x]+=size[y];
msize[x]=max(msize[x],size[y]);
}
msize[x]=max(msize[x],SIZE-size[x]);
if(msize[ROOT]>msize[x]) ROOT=x;
}
void dfs_div(int x,int fa)
{
Fa[x]=fa;
for(int i=last[x];i;i=a[i].next)
{
int y=a[i].y;
dfs2();
}
}
int main()
{
char s[5];
int x,y;
scanf("%d",&n);
cnt=n;
for(int i=1;i<n;i++)
{
scanf("%d %d",&x,&y);
ins(x,y),ins(y,x);
}
dfs_pre(1,0);
init();
SIZE=0,msize[0]=INF,ROOT=0;
find_root(1,0);
dfs_div(ROOT,0);
scanf("%d",&m);
// for(int i=1;i<=m;i++)
// {
// scanf("%s",s+1);
// if(s[1]=='C')
// {
// scanf("%d",&x);
// if(state[x]) cnt++,close(x); else cnt--,turn(x);
// state[x]^=1;
//
// } else printf("%d\n",cnt<2?cht-1:f3.top());
// }
}