bzoj2819: Nim(博弈+树剖)
2819: Nim
题目:传送门
题解:
很久之前学博弈的时候看过的一道水题,其实算不上博弈吧...
直接套上一个裸的树剖啊,把路径上的点值全都xor(xor满足结合率所以就不管那么多随便搞啦)
dog B 肉老师,竟然不告诉我它卡常,搞得我TLE几百年
代码:
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<cmath>
- #include<algorithm>
- #include<iostream>
- using namespace std;
- inline int read()
- {
- int f=,x=;char ch;
- while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
- return f*x;
- }
- struct node
- {
- int x,y,next;
- }a[];int len,last[];
- inline void ins(int x,int y)
- {
- len++;a[len].x=x;a[len].y=y;
- a[len].next=last[x];last[x]=len;
- }
- struct trnode
- {
- int l,r,c,lc,rc;
- }tr[];int trlen;
- inline void bt(int l,int r)
- {
- int now=++trlen;
- tr[now].l=l;tr[now].r=r;tr[now].c=;
- tr[now].lc=tr[now].rc=-;
- if(l<r)
- {
- int mid=(tr[now].l+tr[now].r)/;
- tr[now].lc=trlen+;bt(l,mid);
- tr[now].rc=trlen+;bt(mid+,r);
- }
- }
- inline void change(int now,int p,int c)
- {
- if(tr[now].l==tr[now].r){tr[now].c=c;return ;}
- int lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/;
- if(p<=mid)change(lc,p,c);
- else change(rc,p,c);
- tr[now].c=tr[lc].c^tr[rc].c;
- }
- inline int getsum(int now,int l,int r)
- {
- if(tr[now].l==l && r==tr[now].r)return tr[now].c;
- int lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/;
- if(r<=mid)return getsum(lc,l,r);
- else if(mid+<=l)return getsum(rc,l,r);
- return getsum(lc,l,mid)^getsum(rc,mid+,r);
- }
- int n,fa[],son[],dep[],tot[];
- inline void pre_tree_node(int x)
- {
- son[x]=;tot[x]=;
- for(register int k=last[x];k;k=a[k].next)
- {
- int y=a[k].y;
- if(y!=fa[x])
- {
- dep[y]=dep[x]+;
- fa[y]=x;
- pre_tree_node(y);
- if(tot[y]>tot[son[x]])son[x]=y;
- tot[x]+=tot[y];
- }
- }
- }
- int top[],ys[],id,tp;
- inline void pre_tree_edge(int x)
- {
- int tt=tp;top[x]=tp;ys[x]=++id;
- if(son[x]!=)pre_tree_edge(son[x]);
- for(register int k=last[x];k;k=a[k].next)
- {
- int y=a[k].y;
- if(y!=son[x] && y!=fa[x])
- {
- tp=y;
- pre_tree_edge(y);
- tp=tt;
- }
- }
- }
- int sol(int x,int y)
- {
- int ans=,tx=top[x],ty=top[y];
- while(tx!=ty)
- {
- if(dep[tx]>dep[ty])swap(tx,ty),swap(x,y);
- ans^=getsum(,ys[ty],ys[y]);
- y=fa[ty];ty=top[y];
- }
- if(x==y)return ans^getsum(,ys[x],ys[x]);
- else
- {
- if(dep[x]>dep[y])swap(x,y);
- return ans^getsum(,ys[x],ys[y]);
- }
- }
- int st[],Q;
- char s[];
- int main()
- {
- //freopen("a.in","r",stdin);freopen("a.out","w",stdout);
- n=read();for(int i=;i<=n;++i)st[i]=read();
- len=;memset(last,,sizeof(last));
- for(register int i=;i<n;++i)
- {
- int x=read(),y=read();
- ins(x,y);ins(y,x);
- }
- fa[]=;dep[]=;pre_tree_node();
- id=;tp=;pre_tree_edge();
- trlen=;bt(,id);
- for(register int i=;i<=n;++i)change(,ys[i],st[i]);
- Q=read();
- while(Q--)
- {
- scanf("%s",s+);int x=read(),y=read();
- if(s[]=='Q')
- {
- if(sol(x,y)!=)printf("Yes\n");
- else printf("No\n");
- }
- else change(,ys[x],y);
- }
- return ;
- }
bzoj2819: Nim(博弈+树剖)的更多相关文章
- BZOJ:2819 NIM(树链剖分||DFS序 &&NIM博弈)
著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略的.于是v ...
- BZOJ2819: Nim 树链剖分
Description 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游 ...
- bzoj2819 Nim
题意:给定一棵带点权的树,每次询问用一条路径上的点玩Nim游戏先手是否必胜,支持单点修改. Nim游戏:所有堆的数目异或起来不为0时先手必胜,否则必败. 所以就是单点修改+路径异或和查询. 树剖一发, ...
- 博弈论中的Nim博弈
瞎扯 \(orzorz\) \(cdx\) 聚聚给我们讲了博弈论.我要没学上了,祝各位新年快乐.现在让我讲课我都不知道讲什么,我会的东西大家都会,太菜了太菜了. 马上就要回去上文化课了,今明还是收下尾 ...
- Atcoder #017 agc017 D.Game on Tree 树上NIM 博弈
LINK 题意:树上NIM的模板题,给出一颗树,现有操作删去端点不为根节点的边,其另一端节点都将被移除,不能取者为败 思路:一看就是个NIM博弈题,只是搬到树上进行,树上DFS进行异或 记得#014D ...
- BZOJ2819 Nim 【dfn序 + lca + 博弈论】
题目 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略的. ...
- HDU 2509 Nim博弈变形
1.HDU 2509 2.题意:n堆苹果,两个人轮流,每次从一堆中取连续的多个,至少取一个,最后取光者败. 3.总结:Nim博弈的变形,还是不知道怎么分析,,,,看了大牛的博客. 传送门 首先给出结 ...
- HDU 1907 Nim博弈变形
1.HDU 1907 2.题意:n堆糖,两人轮流,每次从任意一堆中至少取一个,最后取光者输. 3.总结:有点变形的Nim,还是不太明白,盗用一下学长的分析吧 传送门 分析:经典的Nim博弈的一点变形. ...
- 【61测试】【dp】【二分】【前缀和】【树剖】
不要问我为什么昨天考的今天才贴解题报告.. 第一题: 给定3个字符串,求它们的最长公共子序列. 解: 考试时知道肯定是LCS的二维再加一维,用三维,可天堂有路你不走,地狱无门你偏来...灵机一动想出来 ...
随机推荐
- Spring Boot (16) logback和access日志
Spring Boot 内部采用的是Commons Logging进行日志记录,但是在底层为Java Util Logging.Log4J2.Logback等日志框架提供了默认配置. logback ...
- SQLServer 里的三种条件判断的用法:Where GroupBy Having
HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似.WHERE 子句搜索条件在进行分组操作之前应用:而 HAVING 搜索条件在进行分组 ...
- AFN上传多张图片
AFN上传多张图片代码: AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager]; sessionManager.r ...
- Activity生命周期(待整理)
1. 定义 有一些方法共同定义生命周期,如下图示:(图片来自于官网文档) 2. onStart()——在Activity即将对用户可见之前调用 (1)Activity启动动画.二维动画在onStart ...
- 算法之dfs篇
dfs算法是深度搜索算法.从某一节点开始遍历直至到路径底部,如果不是所寻找的,则回溯到上个节点后,再遍历其他路径.不断重复这个过程.一般此过程消耗很大,需要一些优化才能保持算法的高效. hdu1010 ...
- 【Linux】计划任务管理crontab、at
一.计划任务管理 —— crontab 1. crontab 命令 • 按照预先设置的时间周期(分钟.小时.天…… )重复执行用户指定的命令操作,属于周期性计划任务,默认打开“/var/spool/ ...
- MySQL 优化之 index_merge (索引合并)
深入理解 index merge 是使用索引进行优化的重要基础之一.理解了 index merge 技术,我们才知道应该如何在表上建立索引. 1. 为什么会有index merge 我们的 where ...
- 【MySQL】ERROR 1005: Can't create table (errno: 150)的错误解决办法
在mysql 中建立引用约束的时候会出现MySQL ERROR 1005: Can't create table (errno: 150)的错误信息结果是不能建立 引用约束. 出现问题的大致情况 1. ...
- iOS安全策略之HTTPS
1.HTTPS传输流程 2.常用加密算法 3.AFN证书校验策略及核心方法 4.SSL Pinning 5.CA证书申请流程 HTTPS经由超文本传输协议进行通信,但利用SSL/TLS来对数据包进行加 ...
- 洛谷P1025 数的划分【dp】
将整数nn分成kk份,且每份不能为空,任意两个方案不相同(不考虑顺序). 例如:n=7n=7,k=3k=3,下面三种分法被认为是相同的. 1,1,51,1,5; 1,5,11,5,1; 5,1,15, ...