这题的题解就不说了,网上到处是。
但是,我一开始样例RE了,而且是改成调试模式就不RE了,真是难受(可能是windows的问题?)。
然后q234rty大爷用linux机子帮我调试,发现在我进行pop操作后,原先的point_iterator
就失效了。我好菜啊,这都看不出。
#include<cstdio>
#include<vector>
#include<cctype>
#include<ext/pb_ds/priority_queue.hpp>
#include<cstring>
using namespace std;
inline char read() {
static const int IN_LEN = 1000000;
static char buf[IN_LEN], *s, *t;
if (s == t) {
t = (s = buf) + fread(buf, 1, IN_LEN, stdin);
if (s == t) return -1;
}
return *s++;
}
template<class T>
inline void read(T &x) {
static bool iosig;
static char c;
for (iosig = false, c = read(); !isdigit(c); c = read()) {
if (c == '-') iosig = true;
if (c == -1) return;
}
for (x = 0; isdigit(c); c = read())
x = (x + (x << 2) << 1) + (c ^ '0');
if (iosig) x = -x;
}
const int OUT_LEN = 10000000;
char obuf[OUT_LEN], *oh = obuf;
inline void print(char c) {
if (oh == obuf + OUT_LEN) fwrite(obuf, 1, OUT_LEN, stdout), oh = obuf;
*oh++ = c;
}
template<class T>
inline void print(T x) {
static int buf[30], cnt;
if (x == 0) {
print('0');
} else {
if (x < 0) print('-'), x = -x;
for (cnt = 0; x; x /= 10) buf[++cnt] = x % 10 + 48;
while (cnt) print((char)buf[cnt--]);
}
}
inline void flush() {
fwrite(obuf, 1, oh - obuf, stdout);
}
typedef __gnu_pbds::priority_queue<int> pq;
typedef __gnu_pbds::priority_queue<pair<int,int> > pq2;
typedef pq::point_iterator IT;
typedef pq2::point_iterator IT2;
const int N=100005;
inline void up(int&a,int b){if(a<b)a=b;}
inline int max(int a,int b){return a>b?a:b;}
__gnu_pbds::priority_queue<int> ans;
bool col[N];
struct tree{
struct edge{int to,next;}e[N<<1];
int xb,h[N],rt,sum,sz[N],f[N],dep[N],dfn[N],n,dd[N];
struct node{
int fa,dis;
IT it;
};
vector<node> a[N];
__gnu_pbds::priority_queue<int> d1[N];
__gnu_pbds::priority_queue<pair<int,int> > d2[N];
IT2 it2[N];
IT it3[N],null;
bool b[N];
inline void addedge(int u,int v){
e[++xb]=(edge){v,h[u]};h[u]=xb;
e[++xb]=(edge){u,h[v]};h[v]=xb;
}
void dfs(int x,int fa){
f[dfn[++xb]=x]=sz[x]=1;
for(int i=h[x];i;i=e[i].next)
if(e[i].to!=fa && !b[e[i].to])dfs(e[i].to,x),sz[x]+=sz[e[i].to],up(f[x],sz[e[i].to]);
up(f[x],sum-sz[x]);
if(f[rt]>f[x])rt=x;
}
void getdis(int x,int f,int d){
if(d)a[x].back().dis=d;
for(int i=h[x];i;i=e[i].next)if(e[i].to!=f && !b[e[i].to])getdis(e[i].to,x,d+1);
}
void getC(int x){
for(register int j=1;j<=xb;++j){
a[dfn[j]].push_back((node){x,0,0});
if(x!=dfn[j])dd[dfn[j]]=x;
}
getdis(x,0,0);
b[x]=1;int i=h[x];
for(;i;i=e[i].next)if(sz[e[i].to]>sz[x])sz[e[i].to]=sum-sz[x];
for(i=h[x];i;i=e[i].next)
if(!b[e[i].to]){
sum=sz[e[i].to];xb=rt=0;
dfs(e[i].to,x);
getC(rt);
}
}
inline void calc(int x){
static int v;v=0;
static pair<int,int> u;
if(!d2[x].empty()){
if(d2[x].size()>1)u=d2[x].top(),d2[x].pop(),v=d2[x].top().first+u.first,it2[u.second]=d2[x].push(u);
if(col[x])up(v,d2[x].top().first);
it3[x]=ans.push(v);
}
}
inline void ins(int x){
static int i,y,z;
for(i=a[x].size()-1;i;--i){
y=a[x][i].fa,z=a[x][i-1].fa;
if(d1[y].empty() || a[x][i-1].dis>d1[y].top()){
if(it2[y]!=0)d2[z].modify(it2[y],make_pair(a[x][i-1].dis,y));
else it2[y]=d2[z].push(make_pair(a[x][i-1].dis,y));
if(it3[z]!=null)
ans.erase(it3[z]),it3[z]=null;
calc(z);
}
a[x][i].it=d1[y].push(a[x][i-1].dis);
}
}
inline void del(int x){
static int i,y,z,v;
for(i=a[x].size()-1;i;--i){
y=a[x][i].fa,z=a[x][i-1].fa;v=d1[y].top();
d1[y].erase(a[x][i].it);
a[x][i].it=null;
if(d1[y].empty() || v>d1[y].top()){
if(it2[y]!=0){
d2[z].erase(it2[y]);
it2[y]=0;
}
if(!d1[y].empty())it2[y]=d2[z].push(make_pair(d1[y].top(),y));
if(it3[z]!=null)ans.erase(it3[z]),it3[z]=null,calc(z);
}
}
}
inline void prepare(){
register int i;null=d1[0].push(0);
*f=1<<30,sum=n;xb=0,dfs(1,0);
getC(rt);memset(b+1,0,n);
register unsigned int j;for(i=1;i<=n;++i)it3[i]=null;
for(i=1;i<=n;++i)
for(j=a[i].size()-1;j;--j)a[i][j].it=d1[a[i][j].fa].push(a[i][j-1].dis);
for(i=1;i<=n;++i)
if(dd[i] && !d1[i].empty())
it2[i]=d2[dd[i]].push(make_pair(d1[i].top(),i));
for(i=1;i<=n;++i)if(!d2[i].empty())calc(i);
}
}t;
int n,a,b,i,q;
char c;
int main(){
read(n);for(i=1;i<n;++i)read(a),read(b),t.addedge(a,b);t.n=n;
for(i=1;i<=n;++i)col[i]=1;
t.prepare();
read(q);a=n;
while(q--){
c=read();while(!isalpha(c))c=read();
if(c=='C'){
read(i);
if(col[i])--a,t.del(i);
else ++a,t.ins(i);col[i]^=1;
}else print(a?ans.top():-1),print('\n');
}
return flush(),0;
}