[BZOJ 2819]Nim
最近都忙的没空写题解了喵~
看到 1= 终于是保住了也算是一个小小的安慰吧 555……
湖北省队互测题,据说会爆栈,但 Linux 下 栈空间=内存=128M 真的吃不下?
反正我是写了个人工栈~
这似乎是我近 4 天里写的第 3 道树链剖分?
- #include <cstdio>
- #include <cstring>
- #include <cstdlib>
- const int sizeOfPoint=;
- const int sizeOfEdge=;
- int n, m, q;
- int w[sizeOfPoint];
- int f[sizeOfPoint], d[sizeOfPoint], s[sizeOfPoint];
- int num, idx[sizeOfPoint], top[sizeOfPoint], son[sizeOfPoint];
- inline char getch();
- inline int getint();
- inline void putint(int);
- struct edge {int point; edge * next;};
- edge memory[sizeOfEdge], * port=memory;
- edge * e[sizeOfPoint];
- inline edge * newedge(int, edge * );
- inline void link(int, int);
- int tot, stack[sizeOfPoint];
- edge * t[sizeOfPoint];
- inline void dfsTree();
- inline void dfsChain();
- int T[sizeOfPoint<<];
- inline void build();
- inline void updateItem(int, int);
- inline int querySegment(int, int);
- inline void swap(int & , int & );
- inline int queryChain(int, int);
- int main()
- {
- char ch;
- int u, v;
- n=getint();
- for (int i=;i<=n;i++)
- w[i]=getint();
- for (int i=;i<n;i++)
- {
- int u=getint(), v=getint();
- link(u, v);
- }
- dfsTree();
- dfsChain();
- build();
- q=getint();
- for (int i=;i<=q;i++)
- {
- ch=getch(), u=getint(), v=getint();
- if (ch=='Q') putint(queryChain(u, v));
- else updateItem(idx[u], v);
- }
- return ;
- }
- inline char getch()
- {
- register char ch;
- do ch=getchar(); while (ch!='Q' && ch!='C');
- return ch;
- }
- inline int getint()
- {
- register int num=;
- register char ch;
- do ch=getchar(); while (ch<'' || ch>'');
- do num=num*+ch-'', ch=getchar(); while (ch>='' && ch<='');
- return num;
- }
- inline void putint(int num)
- {
- if (num>) putchar('Y'), putchar('e'), putchar('s');
- else putchar('N'), putchar('o');
- putchar('\n');
- }
- inline edge * newedge(int point, edge * next)
- {
- edge * ret=port++;
- ret->point=point; ret->next=next;
- return ret;
- }
- inline void link(int u, int v)
- {
- e[u]=newedge(v, e[u]); e[v]=newedge(u, e[v]);
- }
- inline void dfsTree()
- {
- int u;
- memcpy(t, e, sizeof(e));
- memset(d, 0xFF, sizeof(d)); d[]=;
- s[]=;
- for (stack[++tot]=;tot; )
- {
- u=stack[tot];
- edge *& i=t[u];
- for ( ;i && d[i->point]>=;i=i->next);
- if (i)
- {
- stack[++tot]=i->point;
- f[i->point]=u;
- d[i->point]=d[u]+;
- s[i->point]=;
- }
- else
- {
- if (!f[u]) break;
- s[f[u]]+=s[u];
- if (s[u]>s[son[f[u]]])
- son[f[u]]=u;
- tot--;
- }
- }
- }
- inline void dfsChain()
- {
- int u;
- memcpy(t, e, sizeof(e));
- idx[]=num=; top[]=;
- for (stack[++tot]=;tot; )
- {
- u=stack[tot];
- if (son[u] && !idx[son[u]])
- {
- stack[++tot]=son[u];
- idx[son[u]]=++num;
- top[son[u]]=top[u];
- continue;
- }
- edge *& i=t[u];
- for ( ;i && idx[i->point];i=i->next);
- if (i)
- {
- stack[++tot]=i->point;
- idx[i->point]=++num;
- top[i->point]=i->point;
- }
- else
- {
- if (!f[u]) break;
- tot--;
- }
- }
- }
- inline void build()
- {
- for (m=;m<n+;m<<=);
- for (int i=;i<=n;i++) T[idx[i]+m]=w[i];
- for (int i=m;i>=;i--) T[i]=T[i<<]^T[i<<|];
- }
- inline void updateItem(int i, int t)
- {
- for (T[i+=m]=t, i>>=;i;i>>=) T[i]=T[i<<]^T[i<<|];
- }
- inline int querySegment(int l, int r)
- {
- int sum=;
- for (l=l+m-, r=r+m+;l^r^;l>>=, r>>=)
- {
- if (~l&) sum^=T[l^];
- if ( r&) sum^=T[r^];
- }
- return sum;
- }
- inline void swap(int & u, int & v)
- {
- int t=u; u=v; v=t;
- }
- inline int queryChain(int u, int v)
- {
- int sum=;
- while (top[u]!=top[v])
- {
- if (d[top[u]]<d[top[v]]) swap(u, v);
- sum^=querySegment(idx[top[u]], idx[u]);
- u=f[top[u]];
- }
- if (d[u]>d[v]) swap(u, v);
- sum^=querySegment(idx[u], idx[v]);
- return sum;
- }
1A 好评如潮
[BZOJ 2819]Nim的更多相关文章
- [BZOJ - 2819] Nim 【树链剖分 / DFS序】
题目链接: BZOJ - 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]NIM(dfs序维护树上xor值)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2819 分析: 树上的nim游戏,关键就是要判断树上的一条链的异或值是否为0 这个题目有 ...
- BZOJ 2819: Nim dfs序维护树状数组,倍增
1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家.2.把堆v中的石子数变为k. 分析: ...
- bzoj 2819 Nim dfn序+树状数组维护区间异或值
题目大意 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略 ...
- BZOJ 2819 Nim 树链剖分+树状数组
这题真没什么意思. 不过就是将普通的求Min,Max,求和等东西换成Xor,偏偏Xor还有很多性质. 算是刷道水题吧. #include<iostream> #include<cst ...
- bzoj 2819(DFS序+树状数组+博弈+lca)
2819: Nim Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2045 Solved: 795[Submit][Status][Discuss] ...
- BZOJ:2819 NIM(树链剖分||DFS序 &&NIM博弈)
著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略的.于是v ...
随机推荐
- web前端基础篇⑨
1.web端.app端 目前实现响应式布局,主要用以下两种方式.CSS原生代码响应式布局 @media screen.bootstrap移动设备优先.自带框架. 兼容性 用原生代码的话 根据不同的屏幕 ...
- JPA使用入门
JPA能干什么?我在前面一遍文章<初步了解JPA>基本描述了.不过你不需要点击回去再看.这里简单的再提一下JPA的功能,就是:(1)实现“对象-关系”映射:(2)对象持久化到数据库:(3) ...
- ios开发之网络php
接着前面的学习,几天上午学习了数据库网络值php用户的注册与登录,感觉代码与ios上的oc太相似了,因此学习下来没什么障碍了,下面是代码: 首先是javascript.html文件中: <!DO ...
- iOS仿直播带有气泡动画的UIButton
现在直播软件确实很火,因为需要就写了一个带有动画气泡的按钮,代码中的部分动画有参考到其他童鞋,在这里万分感谢! .h文件 @interface YYBubbleButton : UIButton @p ...
- Linux下swoole的安装配置
前几天搭建swoole环境,在安装php的swoole扩展时不知道什么原因,提示成功,但是使用的时候不能加载,最后决定重新安装php试试,顺便记录了php的安装过程 wget http://cn2.p ...
- windows10和ubuntu16.04双系统下时间不对的问题 ZT
最近装了windows10和ubuntu16.04双系统,仍然出现了喜闻乐见的老问题,装完后,在windows下时区不对,之前的老办法是: sudo gedit /etc/default/rcS ut ...
- 常用类String的方法
String str="hello"; 1.与数组相关的方法 System.out.println(str.length()); System.out.println(str.ch ...
- renderman、arnold及全局光照
走马观花看了一些实现全局光(global illumination)的文章,都是非实时电影级的.的确可以分为两个阵营,一是pixar的renderman中常用的reyes+点云,感觉pixar一路走来 ...
- Android SDK Manager中不显示未下载的api解决方案
Android SDK 在线更新镜像服务器资源用户评价: / 14 Android SDK 在线更新镜像服务器资源:大连东软信息学院镜像服务器地址:http://mirrors.neusoft.ed ...
- linux磁盘存储命令 磁盘存储命令
硬盘空间是一个有限的资源, 硬盘空间是一个有限的资源,用户用下面的命令 可 以随时了解当前硬盘空间的使用情况. 以随时了解当前硬盘空间的使用情况. ? du,df命令 查看磁盘空间状况的操作 , ...