【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
- 【BZOJ】【P2819】【Nim】【题解】【链剖线段树】
- BZOJ P2819 Nim
- 【BZOJ】【P1984】【月下“毛景树”】【题解】【链剖线段树】
- BZOJ 2819 Nim (树链剖分+线段树)
- 【BZOJ】【P2104】【Wc2009】【shortest】【题解】【线段树】
- 【BZOJ】【P3165】【Heoi2013】【Segment】【题解】【线段树】
- 【BZOJ】【P3211】【花神游历各国】【题解】【线段树】
- 【BZOJ】【P1858】【Scoi2010】【序列操作】【题解】【线段树】
- 【BZOJ】【P1756】【Vijos1083 小白逛公园】【题解】【线段树】
- 【BZOJ】【P1135】【POI2009】【Lyz】【题解】【线段树+Hall定理】
- 【BZOJ】【P3226】【Sdoi2008】【校门外的区间】【题解】【线段树】
- 【BZOJ】【P3252】【攻略】【题解】【贪心+dfs序+线段树】
- 【BZOJ】【P1568】【JSOI2008】【Blue Mary开公司】【题解】【线段树】
- 【BZOJ】【P1018】【SHOI2008】【堵塞的交通traffic】【题解】【线段树】
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq 线段树题解
- 【BZOJ】【P1115】【POI2009】【石子游戏Kam】【题解】【Nim】
- 线段树-题解
- 【BZOJ】【P1146】【CTSC2008】【网络管理Network】【题解】【树链剖分+线段树套平衡树】
- SSL延迟有多大?
- MySQL查询表内重复记录
- 《白纸醋》每个月免费送的手机费跟扣扣币你不要?
- uva10382Watering Grass
- Java关键字final、static使用总结
- 【BZOJ】【P2819】【Nim】【题解】【链剖线段树】
- sicily_course_1001
- 学习
- 2014 ACM/ICPC 牡丹江赛区网络赛解题报告汇总
- asp.net上传压缩文件
- 关于报错you cannot combine custom titles with other title features
- Error building Player: Win32Exception: ApplicationName='E:/adt-20140702/sdk\tools\zipalign.exe', Com
- openstack页面自定义插件使用详解(django、ajax、post)(zTree为例)
- UDP中的Connect