bzoj 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的更多相关文章
- [BZOJ - 2819] Nim 【树链剖分 / DFS序】
题目链接: BZOJ - 2819 题目分析 我们知道,单纯的 Nim 的必胜状态是,各堆石子的数量异或和不为 0 .那么这道题其实就是要求求出树上的两点之间的路径的异或和.要求支持单点修改. 方法一 ...
- [BZOJ 2819]NIM(dfs序维护树上xor值)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2819 分析: 树上的nim游戏,关键就是要判断树上的一条链的异或值是否为0 这个题目有 ...
- bzoj 2819 Nim(BIT,dfs序,LCA)
2819: Nim Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1596 Solved: 597[Submit][Status][Discuss] ...
- BZOJ 2819: Nim( nim + DFS序 + 树状数组 + LCA )
虽然vfleaking好像想卡DFS...但我还是用DFS过了... 路径上的石堆异或和=0就是必败, 否则就是必胜(nim游戏). 这样就变成一个经典问题了, 用DFS序+BIT+LCA就可以在O( ...
- bzoj 2819(DFS序+树状数组+博弈+lca)
2819: Nim Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2045 Solved: 795[Submit][Status][Discuss] ...
- [BZOJ 2819]Nim
最近都忙的没空写题解了喵- 看到 1= 终于是保住了也算是一个小小的安慰吧 555…… 湖北省队互测题,据说会爆栈,但 Linux 下 栈空间=内存=128M 真的吃不下? 反正我是写了个人工栈- 这 ...
- BZOJ 2819: Nim dfs序维护树状数组,倍增
1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家.2.把堆v中的石子数变为k. 分析: ...
- bzoj 2819 博弈论
我们可以把 n为偶数的时候,n*n的棋盘看成若干个不相交的2*1的格子,那么对于每个2*1的格子,如果先手选了其中的一个,另一个人都可以选另一个,所以最后使先手没有可以选的格子,先手必败(这里的先手并 ...
- BZOJ 2819 Nim 树链剖分+树状数组
这题真没什么意思. 不过就是将普通的求Min,Max,求和等东西换成Xor,偏偏Xor还有很多性质. 算是刷道水题吧. #include<iostream> #include<cst ...
随机推荐
- group by实现原理及其作用
mysql中group by实现方式有三种,松散索引,紧凑索引,临时文件(文件排序). 在网上看了相关的介绍,大部分介绍都比较晦涩难懂,这里说下我的理解. 在学习SQL优化时,我们都知道可以对grou ...
- 使用前端组件化思想修改todolist
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- e.getMessage() e.printStackTrace() 和e.printStackTrace() 小结
1 e.getMessage() ; 只会获得异常的名称.比如说NullPoint 空指针,就告诉你说是空指针 2.e.toString(): 获得异常种类和错误信息 3.e.printSta ...
- Intellij IDEA设置及快捷键使用总结
1. IDEA内存优化 先看看你机器本身的配置而配置. \IntelliJ IDEA 8\bin\idea.exe.vmoptions -------------------------------- ...
- python3使用stmplib发送邮件
代码如下: import smtplib from email.mime.text import MIMEText from email.header import Header from email ...
- 自定义模板类型vs模板类型自动推测
[自定义模板类型vs模板类型自动推测] GCC在编译时,先确定看是否人工定义了模板的类型,如果定义了,则看传递的参数是否能转换成定义后的类型,如果没定义,则根据参数确定定义的类型. 1. 是否人工定义 ...
- asp.net中GridView传多个值到其它页面的方法
网站开发中,在页面之间的跳转,经常会用到传值,其中可能会传递多个值. 一.CommadArgument传多个值到其他页面. 像Gridview dataList repeater等数据绑定控件中,可以 ...
- 20155330 2016-2017-2 《Java程序设计》第七周学习总结
20155330 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 学习目标 了解Lambda语法 了解方法引用 了解Fucntional与Stream API ...
- 20155322 2016-2017-2 《Java程序设计》第5周学习总结
20155322 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 本周的学习任务是课本第八第九章: 第八章主要是讲异常处理.这里要理解Java的错误以对象的方 ...
- 【Java】SSM框架整合 附源码
前言 前面已经介绍Spring和Mybatis整合,而本篇介绍在IDEA下Spring.Spring MVC.Mybatis(SSM)三个框架的整合,在阅读本篇之前,建议大家先去了解一下Spring. ...