bzoj1095[ZJOI2007]捉迷藏

来源:互联网 发布:cv用录音软件 编辑:程序博客网 时间:2024/05/22 02:21

这题的题解就不说了,网上到处是。
但是,我一开始样例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
原创粉丝点击