这是BZOJ啊。。。
dfs传一个参就不会爆栈了。
然而为什么0msWA?
是Yes不是YES啊。。。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxv 500500 #define maxe 1000500 using namespace std; struct edge { int v,nxt; }e[maxe]; char type[5]; int n,c[maxv],x,y,nume=0,g[maxv],m; int fath[maxv],size[maxv],dis[maxv],top[maxv],w[maxv],son[maxv],cnt=0,fw[maxv]; int ls[maxv<<2],rs[maxv<<2],val[maxv<<2],tot=0,root; void addedge(int u,int v) { e[++nume].v=v; e[nume].nxt=g[u]; g[u]=nume; } void dfs1(int x) { size[x]=1;son[x]=0; for (int i=g[x];i;i=e[i].nxt) { int v=e[i].v; if (v!=fath[x]) { dis[v]=dis[x]+1;fath[v]=x; dfs1(v); size[x]+=size[v];if (size[v]>size[son[x]]) son[x]=v; } } } void dfs2(int x) { if (son[fath[x]]==x) top[x]=top[fath[x]];else top[x]=x; w[x]=++cnt;fw[cnt]=x; if (son[x]!=0) dfs2(son[x]); for (int i=g[x];i;i=e[i].nxt) { int v=e[i].v; if ((v!=fath[x]) && (v!=son[x])) dfs2(v); } } void build(int &now,int left,int right) { now=++tot; if (left==right) { val[now]=c[fw[left]]; return; } int mid=(left+right)>>1; build(ls[now],left,mid); build(rs[now],mid+1,right); val[now]=val[ls[now]]^val[rs[now]]; } void modify(int now,int left,int right,int pos,int x) { if ((left==right) && (left==pos)) { val[now]=c[fw[left]]; return; } int mid=(left+right)>>1; if (pos<=mid) modify(ls[now],left,mid,pos,x); else modify(rs[now],mid+1,right,pos,x); val[now]=val[ls[now]]^val[rs[now]]; } int ask(int now,int left,int right,int l,int r) { if ((left==l) && (right==r)) return val[now]; int mid=(left+right)>>1; if (r<=mid) return ask(ls[now],left,mid,l,r); else if (l>=mid+1) return ask(rs[now],mid+1,right,l,r); else return ask(ls[now],left,mid,l,mid)^ask(rs[now],mid+1,right,mid+1,r); } void work() { scanf("%d%d",&x,&y); int f1=top[x],f2=top[y]; int now=0; while (f1!=f2) { if (dis[f1]<dis[f2]) {swap(f1,f2);swap(x,y);} now^=ask(root,1,cnt,w[f1],w[x]); x=fath[f1];f1=top[x]; } if (dis[x]>dis[y]) swap(x,y); now^=ask(root,1,cnt,w[x],w[y]); if (now==0) printf("No\n"); else printf("Yes\n"); } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&c[i]); for (int i=1;i<=n-1;i++) { scanf("%d%d",&x,&y); addedge(x,y); addedge(y,x); } dfs1(1); dfs2(1); build(root,1,cnt); scanf("%d",&m); for (int i=1;i<=m;i++) { scanf("%s",type); if (type[0]=='C') { scanf("%d%d",&x,&y); c[x]=y; modify(root,1,cnt,w[x],y); } else work(); } return 0; }