萌新求调,过了加强版
查看原帖
萌新求调,过了加强版
544310
wuhupai楼主2024/11/10 19:51
#include<bits/stdc++.h>
#define for1(i,a,b) for( int i=(a);i<=(b);i++)
#define for2(i,a,b) for( int i=(a);i<(b);i++)
#define for3(i,a,b) for( int i=(a);i>=(b);i--)
#define for4(i,a,b) for( int i=(a);i>(b);i--)
#define puba push_back
#define mem(a,b) memset((a),(b),sizeof((a)))
using namespace std;
struct hp{
    priority_queue<int>s,t;
    void push_down(){
        while(!s.empty()&&!t.empty()&&s.top()==t.top()) s.pop(),t.pop();
    }
    int size(){
        return s.size()-t.size();
    }
    bool empty(){
        return s.size()==t.size();
    }
    void push(int x){
        s.push(x);
        push_down();
    }
    void pop(int x){
        t.push(x);
        push_down();
    }
    int top(){
        if(empty()) return -1e9;
        push_down();
        return s.top();
    }
    int get(){
        if(size()<2) return -1e9;
        int g=s.top();
        s.pop();
        push_down();
        int gg=s.top();
        s.push(g);
        push_down();
        return g+gg;
    }
}a[100005],b[100005],ans;

int n;
vector<int>v[100005];
struct tree{
    int dfn[100005],st[20][100005],dis[100005],cnt;
    int go(int x,int y){
        if(dfn[x]<dfn[y]) return x;
        return y;
    }
    int lca(int x,int y){
        if(x==y) return x;
        if(dfn[x]>dfn[y]) swap(x,y);
        x=dfn[x]+1,y=dfn[y];
        int l=log2(y-x+1);
        return go(st[l][x],st[l][y-(1<<l)+1]);
    }
    int d(int x,int y){
        if(!x||!y) return 0;
        int gg=lca(x,y);
        return dis[x]+dis[y]-2*dis[gg];
    }
    void dfs(int u,int from){
        cnt++;
        dfn[u]=cnt;
        st[0][cnt]=from;
        for2(i,0,v[u].size()){
            int to=v[u][i];
            if(to==from) continue;
            dis[to]=dis[u]+1;
            dfs(to,u);
        }
    }
    void init(){
        for1(j,1,18){
            for1(i,1,n){
                if(i+(1<<j)-1>n) break;
                st[j][i]=go(st[j-1][i],st[j-1][i+(1<<(j-1))]);
            }
        }
    }
}tr;

int T,x,y,z,siz[100005],rt,minn=1e9,fa[100005],cnt;
char op;
bool vis[100005];
void getrt(int u,int from,int tot){
    siz[u]=1;
    int maxx=0;
    for2(i,0,v[u].size()){
        int to=v[u][i];
        if(to==from||vis[to]) continue;
        getrt(to,u,tot);
        siz[u]+=siz[to];
        maxx=max(maxx,siz[to]); 
    }
    maxx=max(maxx,tot-siz[u]);
    if(maxx<minn){
        minn=maxx;
        rt=u;
    }
}
void dfs(int u,int from,int x){
    a[x].push(tr.d(u,fa[x]));
    for2(i,0,v[u].size()){
        int to=v[u][i];
        if(to==from||vis[to]) continue;
        dfs(to,u,x);
    }
}
void solve(int u){
    if(fa[u]) dfs(u,0,u);
    b[u].push(0);
    vis[u]=1;
    int kk;
    for2(i,0,v[u].size()){
        int to=v[u][i];
        if(vis[to]) continue;
        minn=1e9;
        getrt(to,0,siz[to]);
        kk=rt;
        fa[kk]=u;
        solve(kk);
        if(!a[kk].empty()) b[u].push(a[kk].top());
    }
    if(b[u].size()>=2) ans.push(b[u].get());
}
void add(int u,int x){
    if(!fa[u]) return;
    int pre=a[u].top();
    a[u].push(tr.d(fa[u],x));
    int nxt=a[u].top();
    if(pre!=nxt){
        int pr=b[fa[u]].get();
        if(pre!=-1e9) b[fa[u]].pop(pre);
        if(nxt!=-1e9) b[fa[u]].push(nxt);
        int nt=b[fa[u]].get();
        if(pr!=nt){
            if(pr!=-1e9) ans.pop(pr);
            if(nt!=-1e9) ans.push(nt);
        }
    }
    add(fa[u],x);
}
void del(int u,int x){
    if(!fa[u]) return;
    int pre=a[u].top();
    a[u].pop(tr.d(fa[u],x));
    int nxt=a[u].top();
    if(pre!=nxt){
        int pr=b[fa[u]].get();
        if(pre!=-1e9) b[fa[u]].pop(pre);
        if(nxt!=-1e9) b[fa[u]].push(nxt);
        int nt=b[fa[u]].get();
        if(pr!=nt){
            if(pr!=-1e9) ans.pop(pr);
            if(nt!=-1e9) ans.push(nt);
        }
    }
    del(fa[u],x);
}
signed main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    // freopen("make.in","r",stdin);
    // freopen("my.out","w",stdout);
    cin>>n;
    for1(i,1,n-1){
        cin>>x>>y;
        v[x].puba(y);
        v[y].puba(x);
    }
    tr.dfs(1,0);
    tr.init();
    getrt(1,0,n);
    solve(1);
    mem(vis,0);
    cnt=n;
    cin>>T;
    while(T--){
        cin>>op;
        if(op=='C'){
            cin>>x;
            if(vis[x]){
                add(x,x);
                int pre=b[x].get();
                b[x].push(0);
                int nxt=b[x].get();
                if(pre!=nxt){
                    if(pre!=1e9) ans.pop(pre);
                    if(nxt!=-1e9) ans.push(nxt);
                }
                vis[x]=0;
                cnt++;
            }else{
                del(x,x);
                int pre=b[x].get();
                b[x].pop(0);
                int nxt=b[x].get();
                if(pre!=nxt){
                    if(pre!=1e9) ans.pop(pre);
                    if(nxt!=-1e9) ans.push(nxt);
                }
                vis[x]=1;
                cnt--;
            }
        }else{
            if(!cnt) cout<<"-1\n";
            else if(cnt==1) cout<<"0\n";
            else cout<<ans.top()<<"\n";//这里输出了-1e9,这种情况按道理是不会存在的
        }
    }
    
    return 0;
}
2024/11/10 19:51
加载中...