2819

思路:

  手工栈;

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 500005
#define maxm maxn<<1
#define maxtree maxn<<2
int head[maxn],V[maxm],E[maxm],f[maxn],m,n;
int deep[maxn],size[maxn],lar[maxn],stanow[maxn],statype[maxn];
int stafa[maxn],stai[maxn],top[maxn],cnt,id[maxn],stachain[maxn];
int dis[maxn],dis_[maxn],tree[maxn];
inline void in(int &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
}
/*void dfs(int now,int fa)
{
size[now]=1,deep[now]=deep[fa]+1,f[now]=fa;
for(int i=head[now];i;i=E[i])
{
if(V[i]==fa) continue;
dfs(V[i],now),size[now]+=size[V[i]];
if(size[V[i]]>size[lar[now]]) lar[now]=V[i];
}
}*/
void dfs1()
{
int now=;stanow[now]=,stafa[now]=;
flag1:
deep[stanow[now]]=deep[stafa[now]]+,size[stanow[now]]=,f[stanow[now]]=stafa[now];
for(stai[now]=head[stanow[now]];stai[now];stai[now]=E[stai[now]])
{
if(V[stai[now]]==stafa[now]) continue;
now++,stanow[now]=V[stai[now-]],stafa[now]=stanow[now-];
goto flag1;
flag2:
size[stanow[now]]+=size[V[stai[now]]];
if(size[V[stai[now]]]>size[lar[stanow[now]]]) lar[stanow[now]]=V[stai[now]];
}
if(now==) return;
else
{
now--;
goto flag2;
}
}
/*
void dfs2(int now,int chain)
{
top[now]=chain,id[now]=++cnt;
if(lar[now]) dfs2(lar[now],now);
for(int i=head[now];i;i=E[i])
{
if(V[i]==f[now]||V[i]==lar[now]) continue;
dfs2(V[i],V[i]);
}
}
*/
void dfs2()
{
int now=;stanow[now]=,stachain[now]=;
flag1:
top[stanow[now]]=stachain[now],id[stanow[now]]=++cnt;
if(lar[stanow[now]])
{
now++,stanow[now]=lar[stanow[now-]],stachain[now]=stachain[now-],statype[now]=;
goto flag1;
flag2:;
}
for(stai[now]=head[stanow[now]];stai[now];stai[now]=E[stai[now]])
{
if(V[stai[now]]==f[stanow[now]]||V[stai[now]]==lar[stanow[now]]) continue;
now++,stanow[now]=V[stai[now-]],stachain[now]=V[stai[now-]],statype[now]=;
goto flag1;
flag3:;
}
if(now==) return;
else
{
now--;
if(statype[now+]==) goto flag2;
else goto flag3;
}
}
#define lowbit(x) x&(-x)
int change(int to,int x)
{
int d=to,tmp=x^dis_[to];
while(d<=n) tree[d]^=tmp,d+=lowbit(d);
dis_[to]=x;
}
int Query(int l,int r)
{
int res=;l--;
while(r) res^=tree[r],r-=lowbit(r);
while(l) res^=tree[l],l-=lowbit(l);
return res;
}
int query(int x,int y)
{
int res=;
while(top[x]!=top[y])
if(deep[top[x]]>deep[top[y]]) res^=Query(id[top[x]],id[x]),x=f[top[x]];
else res^=Query(id[top[y]],id[y]),y=f[top[y]];
if(deep[x]>deep[y]) swap(x,y);
return res^Query(id[x],id[y]);
}
int main()
{
in(n);int u,v;
for(int i=;i<=n;i++) in(dis[i]);
for(int i=;i<n;i++)
{
in(u),in(v);
E[++cnt]=head[u],V[cnt]=v,head[u]=cnt;
E[++cnt]=head[v],V[cnt]=u,head[v]=cnt;
}
cnt=,dfs1(),dfs2();
for(int i=;i<=n;i++) change(id[i],dis[i]);
in(m);char op[];
for(int i=;i<=m;i++)
{
scanf("%s",op),in(u),in(v);
if(op[]=='C') change(id[u],v);
else if(query(u,v)) printf("Yes\n");
else printf("No\n");
}
return ;
}

bzoj 2819的更多相关文章

  1. [BZOJ - 2819] Nim 【树链剖分 / DFS序】

    题目链接: BZOJ - 2819 题目分析 我们知道,单纯的 Nim 的必胜状态是,各堆石子的数量异或和不为 0 .那么这道题其实就是要求求出树上的两点之间的路径的异或和.要求支持单点修改. 方法一 ...

  2. [BZOJ 2819]NIM(dfs序维护树上xor值)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2819 分析: 树上的nim游戏,关键就是要判断树上的一条链的异或值是否为0 这个题目有 ...

  3. bzoj 2819 Nim(BIT,dfs序,LCA)

    2819: Nim Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1596  Solved: 597[Submit][Status][Discuss] ...

  4. BZOJ 2819: Nim( nim + DFS序 + 树状数组 + LCA )

    虽然vfleaking好像想卡DFS...但我还是用DFS过了... 路径上的石堆异或和=0就是必败, 否则就是必胜(nim游戏). 这样就变成一个经典问题了, 用DFS序+BIT+LCA就可以在O( ...

  5. bzoj 2819(DFS序+树状数组+博弈+lca)

    2819: Nim Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2045  Solved: 795[Submit][Status][Discuss] ...

  6. [BZOJ 2819]Nim

    最近都忙的没空写题解了喵- 看到 1= 终于是保住了也算是一个小小的安慰吧 555…… 湖北省队互测题,据说会爆栈,但 Linux 下 栈空间=内存=128M 真的吃不下? 反正我是写了个人工栈- 这 ...

  7. BZOJ 2819: Nim dfs序维护树状数组,倍增

    1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家.2.把堆v中的石子数变为k. 分析: ...

  8. bzoj 2819 博弈论

    我们可以把 n为偶数的时候,n*n的棋盘看成若干个不相交的2*1的格子,那么对于每个2*1的格子,如果先手选了其中的一个,另一个人都可以选另一个,所以最后使先手没有可以选的格子,先手必败(这里的先手并 ...

  9. BZOJ 2819 Nim 树链剖分+树状数组

    这题真没什么意思. 不过就是将普通的求Min,Max,求和等东西换成Xor,偏偏Xor还有很多性质. 算是刷道水题吧. #include<iostream> #include<cst ...

随机推荐

  1. Ubuntu14.04 Tab键自动补全

    Unbuntu14.04 终端中使用Tab键不能自动补全 解决方案 1.利用vi编辑器打开 /etc/bash.bashrc文件(需要root权限) sudo vi /etc/bash.bashrc ...

  2. mysql 复制表数据,表结构的3种方法

    什么时候我们会用到复制表?例如:我现在对一张表进行操作,但是怕误删数据,所以在同一个数据库中建一个表结构一样,表数据也一样的表,以作备份.如果用mysqldump比较麻烦,备份.MYD,.MYI这样的 ...

  3. 动态规划:树形DP-景点中心(树的带权重心)

    话说宁波市的中小学生在镇海中学参加计算机程序设计比赛,比赛之余,他们在镇海中学的各个景点参观.镇海中学共有n个景点,每个景点均有若干学生正在参 观.这n个景点以自然数1至n编号,每两个景点的编号均不同 ...

  4. SVN启停脚本

    说明:特别注意红色部分,外部$1传入Msg函数时失效,故特此读取一遍再传入!执行时要给脚本加执行权限!#chmod 755 /scripts/svn [root@kazihuo /scripts]# ...

  5. angularJS $resource

    $resource是一个更方便地与RESTful服务器API进行交互,可以方便地定义一个REST资源,而不必手动所有的声明CRUD方法的Service. 使用 1.要使用$resource首先要在HT ...

  6. R4—R版本升级及swirl新产品出炉

    干货一: 经常有很多朋友会遇到这样一个问题:安装R版本使用了很久以后,在使用新packages时,提示这些包是基于更高版本的R构建的,因此,无法使用这些packages,一般的童鞋遇到这类问题可能非常 ...

  7. 【AtCoder Regular Contest 080E】Young Maids [堆][线段树]

    Young Maids Time Limit: 50 Sec  Memory Limit: 512 MB Description 给定一个排列,每次选出相邻的两个放在队头,要求字典序最小. Input ...

  8. 洛谷P3953 [NOIP2017]逛公园

    K<=50,感觉可以DP 先建反图求出从n到各个点的最短路,然后在正图上DP 设f[当前点][比最短路多走的距离]=方案数 转移显然是 $f[v][res]=\sum f[u][res+tmp] ...

  9. 关于初次使用Linux的一些小经验

    前些天看了一下腾讯的招聘的网站,发现大多数开发都要求在Linux系统下进行,所以就赶紧装了个Ubuntu来玩玩,可是装了以后才发现,初次接触Linux就跟小学生差不多,大部分操作都要通过命令行来完成, ...

  10. J - Clairewd’s message HDU - 4300(扩展kmp)

    题目链接:https://cn.vjudge.net/contest/276379#problem/J 感觉讲的很好的一篇博客:https://subetter.com/articles/extend ...