【BZOJ】【P2819】【Nim】【题解】【链剖线段树】

来源:互联网 发布:昆仑数据科技面试 编辑:程序博客网 时间:2024/04/30 08:50

传送门:http://www.lydsy.com:808/JudgeOnline/problem.php?id=28193

裸链剖不用多说

不会树状数组异或和

不会dfsLCA

非递归链剖真是丑

Code:

#include<bits/stdc++.h>#define lson i<<1,l,mid#define rson i<<1|1,mid+1,r#define L i<<1#define R i<<1|1using namespace std;const int maxn=5e5+10;int siz[maxn],dep[maxn],fa[maxn],top[maxn],w[maxn],z,a[maxn],son[maxn];vector<int>G[maxn];int order[maxn];  stack<int>S;  void dfs(int u){      S.push(u);      order[0]=0;      while(!S.empty()){          int u=S.top();S.pop();          son[u]=0;siz[u]=1;          for(int i=0;i<G[u].size();i++){              int v=G[u][i];              if(v!=fa[u]){                  dep[v]=dep[u]+1;                  fa[v]=u;                  S.push(v);                  order[++order[0]]=v;                          }          }      }      for(int i=order[0];i>=1;i--){          int u=order[i];          if(siz[son[fa[u]]]<siz[u])son[fa[u]]=u;          siz[fa[u]]+=siz[u];      }  }  typedef pair<int,int> pii;deque<pii>q;  void build(int u,int tp){      q.push_front(pii(u,tp));      while(!q.empty()){          pii t=q.front();q.pop_front();          int u=t.first,tp=t.second;          w[u]=++z;top[u]=tp;          if(son[u])q.push_front(pii(son[u],tp));          for(int i=0;i<G[u].size();i++){              int v=G[u][i];              if(v!=fa[u]&&v!=son[u])              q.push_back(pii(v,v));          }      }  }  struct seg_tree{int t[maxn<<2];seg_tree(){memset(t,0,sizeof t);}void Change(int i,int l,int r,int pos,int old,int val){t[i]^=old;if(l==r){t[i]^=val;return ;}int mid=(l+r)>>1;if(pos<=mid)Change(lson,pos,old,val);else Change(rson,pos,old,val);t[i]=t[L]^t[R];}int Qsum(int i,int l,int r,int l0,int r0){if(l0>r0)swap(l0,r0);if(l0<=l&&r0>=r){return t[i];}int mid=(l+r)>>1,ans=0;if(l0<=mid)ans^=Qsum(lson,l0,r0);if(r0>mid)ans^=Qsum(rson,l0,r0);return ans;}}T;int n,m;int getint(){int res=0;char c=getchar();while(!isdigit(c))c=getchar();while(isdigit(c))res=(res<<1)+(res<<3)+c-'0',c=getchar();return res;}void Q(int u,int v){int ans=0;while(top[u]!=top[v]){if(dep[top[u]]<dep[top[v]])swap(u,v);ans^=T.Qsum(1,1,n,w[u],w[top[u]]);u=fa[top[u]];}ans^=T.Qsum(1,1,n,w[u],w[v]);puts(ans?"Yes":"No");}void C(int u,int k){T.Change(1,1,n,w[u],a[u],k);a[u]=k;}int main(){n=getint();for(int i=1;i<=n;i++)a[i]=getint();for(int i=1;i<n;i++){int u=getint(),v=getint();G[u].push_back(v);G[v].push_back(u);}int root=(n+1)>>1;dfs(root);build(root,root);for(int i=1;i<=n;i++)T.Change(1,1,n,w[i],0,a[i]);m=getint();while(m--){char op=getchar();while(op!='Q'&&op!='C')op=getchar();if(op=='Q'){int u=getint(),v=getint();Q(u,v);}else{int u=getint(),k=getint();C(u,k);}}return 0;}


0 0
原创粉丝点击