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 ...
随机推荐
- Hadoop生态圈-Hbase的rowKey设计原则
Hadoop生态圈-Hbase的rowKey设计原则 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- SQL优化:
今日给人查找数据,时间关系,写个比较粗暴的SQL语句: #2s587ms#直接将所有表关联,比较粗暴 select go.businessId,dd.dict_namefrom fn_xte.gt ...
- PHP超级全局变量
$_get:地址栏上获取值 $_post:post表单发送数据 $_request:即有get也有post的内容 如果post和get重名:那么由设置项决定,比如request_crder=" ...
- zkw费用流模板
理论:http://www.cnblogs.com/acha/p/6735037.html #include<cstdio> #include<cstring> #includ ...
- SpringBoot 线程池配置 实现AsyncConfigurer接口方法
目的是: 通过实现AsyncConfigurer自定义线程池,包含异常处理 实现AsyncConfigurer接口对异常线程池更加细粒度的控制 *a) 创建线程自己的线程池 b) 对void ...
- shell逐行读取excel并执行sql
背景:测试同学想根据一组user_id 获取token做测试,由于各种原因(数据量大,sql语句复杂),只能根据user_id一条条查,于是写了个脚本: 1, 先查询需要的user_id 导出到use ...
- 有用的JavaScript开发小建议
这篇文章将向你分享一些不为人知的但很有用的JavaScript小建议,对那些刚涉及使用JavaScript编程语言的初级开发者应该有很大的帮助. 1. 用数组长度截取数组 我们都知道,对象都是通过使用 ...
- kafka入门(1)- 基本概念
Kafka is a distributed,partitioned,replicated commit logservice Kafka提供了类似于JMS的特性,但是在设计实现上完全不同,并不是JM ...
- Linux下ssh的使用
更多内容推荐微信公众号,欢迎关注: 摘抄自:https://www.cnblogs.com/kevingrace/p/6110842.html 对于linux运维工作者而言,使用ssh远程远程服务器是 ...
- 聊天室(下篇)GatewayWorker 与 Laravel 的整合
思路 上一篇大概梳理了一下 GatewayWorker 的基础知识.这篇就来准备整合 GatewayWorker 到 Laravel. GatewayWorker 是基于 Socket 监听的服务器框 ...