bzoj 1095

来源:互联网 发布:牛菲特软件 编辑:程序博客网 时间:2024/06/06 10:07

神题啊。。。
括号序列做法;
代码扒的hwzer的…

#include<bits/stdc++.h>#define rep(i,k,n) for(int i=k;i<=n;i++)#define ls x<<1#define rs x<<1|1using namespace std;const int N=100005;const int N2=500005;const int inf=1000000000;int head[N],tot=0;struct E{int to,next;E(int to=0,int next=0):to(to),next(next){}}edge[2*N];void add(int x,int y){    edge[++tot]=E(y,head[x]);head[x]=tot;    edge[++tot]=E(x,head[y]);head[y]=tot;    }int c[N],black=0,v[N2],n,Q,pos[N];inline int max(int a,int b,int c){    return max(max(a,b),c);}struct seg{    int c1,c2,r1,r2,l1,l2,dis;    void ini(int x){        dis=-inf;        c1=c2=0;        if(v[x]==-9)c1=1;        if(v[x]==-6)c2=1;    // ][ 长这样!         if(v[x]>0 && c[v[x]])        r1=r2=l1=l2=0;        else r1=r2=l1=l2=-inf;    }}t[2000005];int top=0;void dfs(int x,int fa){    v[++top]=-6;    v[++top]=x;    pos[x]=top;    for(int i=head[x];i;i=edge[i].next){        int vv=edge[i].to;        if(vv!=fa)        dfs(vv,x);    }    v[++top]=-9;}inline seg merge(seg s1,seg s2){    seg s;    int a=s1.c1,b=s1.c2,c=s2.c1,d=s2.c2;    s.dis=max(s1.dis,s2.dis);    s.dis=max(s.dis,s1.r1 + s2.l2 , s1.r2 + s2.l1);    if(c>b)s.c1=a+c-b,s.c2=d;    else s.c1=a,s.c2=d+b-c;    s.r1=max(s1.r1-c+d , s1.r2+c+d , s2.r1);    s.r2=max(s1.r2+c-d , s2.r2);    s.l1=max(s2.l1-b+a,s2.l2 + b+a , s1.l1);    s.l2=max(s2.l2+b-a , s1.l2);    return s;}void build(int x,int l,int r){    if(l==r){t[x].ini(l);return;}    int mid=(l+r)>>1;    build(ls,l,mid);    build(rs,mid+1,r);    t[x]=merge(t[ls],t[rs]);}void change(int x,int l,int r,int q){    if(l==r){t[x].ini(l);return;}    int mid=(l+r)>>1;    if(q<=mid)change(ls,l,mid,q);    else change(rs,mid+1,r,q);    t[x]=merge(t[ls],t[rs]);}int main(){//freopen("in.in","r",stdin);//freopen("out.out","w",stdout);    scanf("%d",&n);int x,y;    black=n;rep(i,1,n)c[i]=1;    rep(i,1,n-1){scanf("%d%d",&x,&y);add(x,y);    }    dfs(1,0);//  rep(i,1,top)printf("%d ",v[i]);    build(1,1,top);    scanf("%d",&Q);    char s[20];    while(Q--){        scanf("%s",s);        if(s[0]=='C'){            scanf("%d",&x);            c[x] ? black-- : black++;            c[x]^=1;            change(1,1,top,pos[x]);        }        else {            if(!black)puts("-1");            if(black==1)puts("0");            else printf("%d",t[1].dis);            printf("\n");        }    }    return 0;   }
0 0
原创粉丝点击