[博弈]ZOJ3591 Nim
题意:
给了一串数,个数不超过$10^5$,这串数是通过题目给的一段代码来生成的
int g = S;
for (int i=; i<N; i++) {
a[i] = g;
if( a[i] == ) { a[i] = g = W; }
if( g% == ) { g = (g/); }
else { g = (g/) ^ W; }
}
其中S、N、W都是输入的。
问:从中取连续的一段出来玩Nim博弈,先手赢的取法有多少种。
Nim博弈的结论:每堆异或,最后结果为0的先手输,否则,先手赢;
于是这道题就变成了取连续的一段,异或值不为0的取法数。
N最大有1e5,显然需要O(n)复杂度的方法
异或没什么感觉...如果这道题问的是 取连续的一段,和为X的取法有多少种
那么就很自然的能想到前缀和 第i到第j的总和为sum[j]-sum[i-1]
那联想到这道题,能不能求个前缀异或呢?
对!
而且异或能分为 0 与 非0 两种情况
那么在查询 第i到第j 这一段的异或值时,只需要比较 xor_sum[i] 与 xor_sum[j]
假设xor_sum[i]=X; xor_sum[j]=X;
那么很显然i+1到j的这一段为0 ( X xor 0 = X)
我们只需要记录有多少段为0,用总的n*(n+1)/2去减去就是答案了;
为什么要记录有多少段为0?记录有多少段为0?
我们已经有前缀异或,那么当第二次出现某一值时,这个值 前一次出现的位置 到 本次出现的位置 之间这一段 就是异或值为0的。
因此我们统计异或值为0的要方便的多。
做法就是记录所有的xor_sum出现的次数加起来就好了嘛
int a[];
map<LL, LL> mp;
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int n, s, w;
scanf("%d%d%d", &n, &s, &w);
int g = s;
for (int i=; i<n; i++)
{
a[i] = g;
if( a[i] == )
a[i] = g = w;
if( g% == )
g = (g/);
else
g = (g/) ^ w;
}
LL xor_sum=, ans=;
mp.clear();
mp[]=;
for(int i=;i<n;i++)
{
xor_sum^=a[i];
ans+=mp[xor_sum];
mp[xor_sum]++;
}
print((LL)n*(n+)/-ans);
}
return ;
}
ZOJ 3591
[博弈]ZOJ3591 Nim的更多相关文章
- hihocoder 1163 博弈游戏·Nim游戏
1163 : 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob. Alice与Bob总是在进行各种各样的 ...
- hiho一下 第四十五周 博弈游戏·Nim游戏·二 [ 博弈 ]
传送门 题目1 : 博弈游戏·Nim游戏·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Alice和Bob这一次准备玩一个关于硬币的游戏:N枚硬币排成一列,有的正面 ...
- zoj3591 Nim(Nim博弈)
ZOJ 3591 Nim(Nim博弈) 题目意思是说有n堆石子,Alice只能从中选出连续的几堆来玩Nim博弈,现在问Alice想要获胜有多少种方法(即有多少种选择方式). 方法是这样的,由于Nim博 ...
- [hihoCoder] 博弈游戏·Nim游戏
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob.Alice与Bob总是在进行各种各样的比试,今天他们在玩一个取石子的游戏.在 ...
- HDU 3032 (Nim博弈变形) Nim or not Nim?
博弈的题目,打表找规律还是相当有用的一个技巧. 这个游戏在原始的Nim游戏基础上又新加了一个操作,就是游戏者可以将一堆分成两堆. 这个SG函数值是多少并不明显,还是用记忆化搜索的方式打个表,规律就相当 ...
- 一种斐波那契博弈(Fibonacci Nim)
事实上我也不知道这算是哪个类型的博弈 是在复习$NOIP$初赛的时候看到的一个挺有趣的博弈 所以就写出来分享一下 $upd \ on \ 2018.10.12$忽然发现这个其实就是$Fibonacci ...
- Nim博弈(nim游戏)
http://blog.csdn.net/qiankun1993/article/details/6765688 NIM 游戏 重点结论:对于一个Nim游戏的局面(a1,a2,...,an),它是P- ...
- hihocoder博弈游戏·Nim游戏·三
在这一次游戏中Alice和Bob决定在原来的Nim游戏上增加一条规则:每一次行动时,不仅可以选择一堆取走任意数量的石子(至少取1颗,至多取出这一堆剩下的所有石子),还可以选择将一堆石子分成两堆石子,但 ...
- POJ 3480 John [博弈之Nim 与 Anti-Nim]
Nim游戏:有n堆石子,每堆个数不一,两人依次捡石子,每次只能从一堆中至少捡一个.捡走最后一个石子胜. 先手胜负:将所有堆的石子数进行异或(xor),最后值为0则先手输,否则先手胜. ======== ...
随机推荐
- vJine 第三波 之 Lua 来袭 vJine.Lua
vJine.Lua vJine.Lua是Lua语言的C#封装库,可实现通过C#直接运行Lua脚本并与Lua脚本交互的功能. 1. 授权: MPL2.0 相关资源: nuget:(https://www ...
- ASP.NET实现在线人员实时显示
在最近的学习中,参考其他资源,做了一个简单的在线人员显示的功能,总结了一下,思路如下: 1.定义一个全局的内存来作为在线人员列表 2.通过实时判断用户Session值,来判断某个用户的登录或离线 3. ...
- javascript 基础API
Math.random() 取值范围[0,1) 大于等于0小于1,包括0,不包括1 Math.floor() 向下取整 Math.ceil() 向上取整 第一题:一组数的规则如下:1.1.2.3. ...
- javascript笔记——jqGrid再次封装
xingrunzhao js插件再次封装 demo 'use strict'; /** * commerce grid框架 * 依赖jqgrid */ (function ($_self, jQuer ...
- Navicat for mysql linux 破解方法
安装方法 进入下载页面:http://www.navicat.com.cn/download/navicat-for-mysql ,选择Linux版本进行下载,下载后解压安装包,运行 start_ ...
- DEDECMS中,获取面包屑导航
获取面包屑导航 {dede:field name='position'/} {dede:field.position/}
- nand flash相关
关于nandflash的说明,请参考其他. 现在先贴出来韦东山先生的代码,作我学习之用. @************************************************ @ Fil ...
- 《C和指针》 读书笔记 -- 第9章 字符串、字符和字节
1.字符串以NUL结尾,但字符串长度不包括NUl字节. 2.复制字符串 char *strcpy(char *dst,char const *src); 3.连接字符串 char *strcat(ch ...
- python del函数
del用于list列表及字典操作,删除一个或者连续几个元素也可以删除字典指定的key 示例程序如下: >>> a = [-1, 3, 'aa', 85] # 定义一个list&g ...
- main函数的正确格式
main函数称之为主函数,一个C程序总是从main()函数开始执行的.在关于C语言的网贴和图书中,可以看到main函数的多种格式,这些格式,有的是正确的,有的是不正确的,为了避免错误,现归纳整理如下. ...