bzoj1095[ZJOI2007]捉迷藏

这题的题解就不说了,网上到处是。
但是,我一开始样例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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值