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 ...
随机推荐
- python 调用aiohttp
1. aiohttp安装 pip3 install aiohttp 1.1. 基本请求用法 async with aiohttp.get('https://github.com') as r: a ...
- day13 类的补充
访问修饰符 同包 不同包 本类 子类 非子类 子类 ...
- 关于JSON的解析方式
借鉴:站在巨人的肩膀上 一.json-lib json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,在Json.org网站上,Java可以使用 ...
- 关于connect by 误区讲解,纯属个人心得和经验,有图有文字
本博客是自己在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处. http://www.cnblogs.com/king-xg/p/6927541.html 如果觉得对您有帮 ...
- 贪心问题:区间覆盖 POJ 2376 Cleaning Shift
题目:http://poj.org/problem?id=2376 题意:就是 N 个区间, 输入 N 个区间的 [begin, end],求能用它们覆盖区间[1,T]的最小组合. 题解: 1. 首先 ...
- SpringCloud (十) Hystrix Dashboard单体监控、集群监控、与消息代理结合
一.前言 Dashboard又称为仪表盘,是用来监控项目的执行情况的,本文旨在Dashboard的使用 分别为单体监控.集群监控.与消息代理结合. 代码请戳我的github 二.快速入门 新建一个Sp ...
- [转载]用NodeJS打造你的静态文件服务器
http://www.open-open.com/bbs/view/1321344823593 本文是我对V5Node项目的总结,该项目的特性包括: 项目大多数的文件都是属于静态文件,只有数据部分存在 ...
- [整理]C语言函数说明和定义
函数的一般形式是:type-specifier function_name(parameter list) parameter declarations{ body of the function ...
- soj1036. Crypto Columns
1036. Crypto Columns Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description The columnar en ...
- [hadoop]hadoop api 新版本与旧版本的差别
突然现在对以后的职业方向有些迷茫,不知道去干什么,现在有一些语言基础,相对而言好的一些有Java和C,选来选去不知道该选择哪个方向,爬了好多网页后,觉得自己应该从java开始出发,之前有点心不在焉,不 ...