SPOJ

来源:互联网 发布:皮影客软件免费下载 编辑:程序博客网 时间:2024/06/03 09:08
#include<bits/stdc++.h>using namespace std;const int MAXN=(int)1e5+10;struct edge{int to,nxt;}ed[MAXN<<1];int dp[MAXN][2],sum[MAXN],head[MAXN],cnt;int n,m;void addedge(int u,int v){ed[cnt].to=v;ed[cnt].nxt=head[u];head[u]=cnt++;}int p[MAXN],son[MAXN],fa[MAXN],sz[MAXN],top[MAXN],pos,rp[MAXN],col[MAXN];void add(int x,int y){while(x<=n){sum[x]+=y;x+=x&(-x);}}int getsum(int l,int r){l--;int re=0;while(r){re+=sum[r];r-=r&(-r);}while(l){re-=sum[l];l-=l&(-l);}return re;}void add(int l,int r,int x,int y){r++;while(l<=n){dp[l][y]+=x;l+=l&(-l);}while(r<=n){dp[r][y]-=x;r+=r&(-r);}}int getdp(int x,int y){int re=0;while(x){re+=dp[x][y];x-=x&(-x);}return re;}void dfs1(int u,int pre){fa[u]=pre;sz[u]=1;for(int i=head[u];i!=-1;i=ed[i].nxt){int v=ed[i].to;if(v!=pre){dfs1(v,u);sz[u]+=sz[v];if(sz[son[u]]<sz[v])son[u]=v;}}}void dfs2(int u,int tp){top[u]=tp;p[u]=++pos;rp[p[u]]=u;if(son[u]!=0)dfs2(son[u],tp);for(int i=head[u];i!=-1;i=ed[i].nxt){int v=ed[i].to;if(v!=son[u]&&v!=fa[u]){dfs2(v,v);}}add(p[u],p[u],sz[u],col[u]);add(p[u],p[u],1,col[u]^1);}int query(int u){if(u==1)return u;int re=u;while(getsum(p[top[u]],p[u])==col[re]*(p[u]-p[top[u]]+1)){re=top[u];u=fa[top[u]];if(u==0)break;}if(col[u]==col[re]&&u!=0){int l=p[top[u]],r=p[u];while(l<=r){int mid=l+r>>1;if(getsum(mid,p[u])==col[re]*(p[u]-mid+1)){re=rp[mid];r=mid-1;}else l=mid+1;}}return re;}int main(){col[0]=-1;memset(head,-1,sizeof(head));scanf("%d",&n);for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);addedge(u,v);addedge(v,u);}dfs1(1,0);dfs2(1,1);for(int i=1;i<=n;i++){}scanf("%d",&m);int op,x;for(int i=1;i<=m;i++){scanf("%d%d",&op,&x);if(op==0){x=query(x);printf("%d\n",getdp(p[x],col[x]));}else {if(x!=1){int f1=fa[x],f2;f2=query(f1);int dp1=getdp(p[x],col[x]),dp2=getdp(p[x],col[x]^1);if(col[f1]==col[x]){add(p[f1],p[f1],dp2,col[x]^1);while(top[f1]!=top[f2]){add(p[top[f1]],p[f1],-dp1,col[x]);f1=fa[top[f1]];}add(p[f2],p[f1],-dp1,col[x]);if(f2!=1){add(p[fa[f2]],p[fa[f2]],-dp1,col[f2]);}}else{add(p[f1],p[f1],-dp1,col[x]);while(top[f1]!=top[f2]){add(p[top[f1]],p[f1],dp2,col[x]^1);f1=fa[top[f1]];}add(p[f2],p[f1],dp2,col[x]^1);if(f2!=1){add(p[fa[f2]],p[fa[f2]],dp2,col[f2]);}}}col[x]^=1;if(col[x]==0){add(p[x],-1);}else {add(p[x],1);}}}return 0;}


原创粉丝点击