【BZOJ 4035】 4035: [HAOI2015]数组游戏 (博弈)
4035: [HAOI2015]数组游戏
Time Limit: 15 Sec Memory Limit: 32 MB
Submit: 181 Solved: 89Description
有一个长度为N的数组,甲乙两人在上面进行这样一个游戏:首先,数组上有一些格子是白的,有一些是黑的。然后两人轮流进行操作。每次操作选择一个白色的格子,假设它的下标为x。接着,选择一个大小在1~n/x之间的整数k,然后将下标为x、2x、...、kx的格子都进行颜色翻转。不能操作的人输。现在甲(先手)有一些询问。每次他会给你一个数组的初始状态,你要求出对于这种初始状态他是否有必胜策略。Input
接下来2*K行,每两行表示一次询问。在这两行中,第一行一个正整数W,表示数组中有多少个格子是白色的,第二行则有W个1~N之间的正整数,表示白色格子的对应下标。Output
对于每个询问,若先手必胜输出"Yes",否则输出"No"。答案之间用换行隔开
Sample Input
3
2
2
1 2
2
2 3Sample Output
Yes
No
【样例解释】
在第一个询问中,甲选择点1,然后将格子1*1和2*1翻过来即可。
第二个询问中,无论甲选择哪个点,都只能翻掉一个格子。乙只需
翻掉另一个格子就行了。
N<=1000000000 , K,W<=100 , 不会有格子在同
一次询问中多次出现。HINT
Source
【分析】
把每一个白点看成是一个子游戏,最后将SG函数全部异或起来即可,由SG定理可知有:
$SG(i)$ = $mex${$SG[i*1]$^$SG[i*2]$^$...$ ^ $SG[i*k]$},$k=[2,N/i]$。
这个第一步应该想到的,但是这样子直接暴力不行。
实际上某一个SG[i]函数的值只和N/i有关,因此有用的状态只有$O(\sqrt n)$个。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define Maxn 500010 int n,sq,sg[][Maxn];
int w[Maxn],wl;
bool vis[Maxn]; int nxt(int x,int y) {return x==y?y+:y/(y/(x+));} void init()
{
memset(vis,,sizeof(vis));
for(int i=;i<=n;i=nxt(i,n))
{
wl=;int now=;
for(int j=;j<=i;j=nxt(j,i))
{
int x=i/j;
int nw=(x>sq)?sg[][n/x]:sg[][x];
// if(!((i/x-i/(x+1))&1)) continue;
w[++wl]=now^nw;
vis[w[wl]]=;
// now^=nw;
if((i/x-i/(x+))&) now^=nw;
}
now=;
while(vis[now]) now++;
if(i>sq) sg[][n/i]=now;
else sg[][i]=now;
for(int j=;j<=wl;j++) vis[w[j]]=;
}
} int main()
{
scanf("%d",&n);
sq=(int)sqrt((double)n);
init();
int T;
scanf("%d",&T);
while(T--)
{
int sm,ans=;scanf("%d",&sm);
while(sm--)
{
int x;
scanf("%d",&x);
ans^=(n/x>sq)?sg[][x]:sg[][n/x];
}
if(ans) printf("Yes\n");
else printf("No\n");
}
return ;
}
不会打,膜了一下lych_cys的代码。。
判断&1那里是如果有偶数个相同的,异或起来等于0,就不用异或进去了。
2017-04-11 10:58:52
【BZOJ 4035】 4035: [HAOI2015]数组游戏 (博弈)的更多相关文章
- @bzoj - 4035@ [HAOI2015]数组游戏
目录 @description@ @solution@ @accepted code@ @details@ @description@ 有一个长度为N的数组,甲乙两人在上面进行这样一个游戏: 首先,数 ...
- bzoj4035 [HAOI2015]数组游戏
这题显然把每个白格子看成一个子游戏 一个白格子$x$的$sg$值是$mex{[0,sg[2x],sg[2x] XOR sg[3x].....]}$ 打表发现一个数的$sg$值只和$n/x$有关,然后分 ...
- [HAOI2015]数组游戏
题目大意: 有一排n个格子,每个格子上都有一个白子或黑子,在上面进行游戏,规则如下: 选择一个含白子的格子x,并选择一个数k,翻转x,2x,...,kx格子上的子. 不能操作者负. 思路: 将“某个格 ...
- 【BZOJ4035】数组游戏(博弈论)
[BZOJ4035]数组游戏(博弈论) 题面 BZOJ 洛谷 题解 很明显是一个翻硬币游戏的变形,因此当前局面的\(SG\)函数值就是所有白格子单独存在的\(SG\)函数的异或和. 那么,对于每一个位 ...
- BZOJ 1444:[JSOI2009]有趣的游戏
BZOJ 1444:[JSOI2009]有趣的游戏 题目链接 首先我们建出Trie图,然后高斯消元. 我们设\(f_i\)表示经过第\(i\)个点的期望次数: \[ f_x=\sum i\cdot p ...
- bzoj 5393 [HAOI2018] 反色游戏
bzoj 5393 [HAOI2018] 反色游戏 Link Solution 最简单的性质:如果一个连通块黑点个数是奇数个,那么就是零(每次只能改变 \(0/2\) 个黑点) 所以我们只考虑偶数个黑 ...
- BZOJ.2000.[HNOI2010]stone取石头游戏(博弈)
BZOJ 洛谷 低估这道神题了_(:з」∠)_ MilkyWay好狠啊(小声) \(Description\) 有一些数字,被分成若干双端队列(从两边都可以取)和最多两个栈(只能从某一边一个一个取)的 ...
- bzoj4035【HAOI2015】数组游戏
题目描述 有一个长度为N的数组,甲乙两人在上面进行这样一个游戏:首先,数组上有一些格子是白的,有一些是黑的.然 后两人轮流进行操作.每次操作选择一个白色的格子,假设它的下标为x.接着,选择一个大小在1 ...
- 【BZOJ 4034】[HAOI2015]树上操作 差分+dfs序+树状数组
我们只要看出来这道题 数组表示的含义就是 某个点到根节点路径权值和就行 那么我们可以把最终答案 看做 k*x+b x就是其深度 ,我们发现dfs序之后,修改一个点是差分一个区间,修改一个点的子树,可以 ...
随机推荐
- CSS预处理器们
CSS预处理器有很多,最早的是2006年的Less,到后来2010年的SASS,还有现在也很出名的Stylus.不过要使用它们都要使用一些工具,比如Less的话要使用Grunt或者Gulp或者Node ...
- (4.1)LingPipe在Eclipse中的运行
酒店评论情感分析系统(四)——LingPipe在Eclipse中的运行 本来打算在做这个项目的时候,使用基于语义的文本倾向性分析方法,即先通过对评论文本进行中文分析,去停用词,然后在倾向性语义模式库的 ...
- linux 在命令行中通过conda使用anaconda
在 ~/.bash_profile中添加 export PATH="/home/taoke/anaconda/bin:$PATH"
- 数组中的each 和 jquery 中的 each
数组的实例上都有一个叫做 forEach 的方法,这个方法定义在 Array.prototype 上,所以数组的所有实例都可以使用 forEach 这个方法. forEach 方法的语法结构如下: v ...
- 常见的bug
常见bug 一. Android系统功能测试设计的测试用例: a.对所测APP划分模块 b.详细列出每个模块的功能点(使用Xmind绘制功能图) c.使用等价类划分.边界值.场景法等对各功能点编写测试 ...
- OSCP考试回顾
技术背景 从2011年开始接触学习渗透测试,全职做过的职位有渗透测试,Python后端研发,DevOps,甲方安全打杂. 学习过程 首先考试报名,交钱.买了价值800美元的一个月lab,包含Pente ...
- logging模块配置笔记
logging模块配置笔记 log文件的路径 #判断在当前的目录下是否有一个logs文件夹.没有则创建 log_dir = os.path.dirname(os.path.dirname(__file ...
- 191.Number of 1Bits---位运算---《剑指offer》10
题目链接:https://leetcode.com/problems/number-of-1-bits/description/ 题目大意:与338题类似,求解某个无符号32位整数的二进制表示的1的个 ...
- php 面试指南
https://xianyunyh.gitbooks.io/php-interview/
- Prime
#include<iostream>#include<cstdio>#include<cstring>using namespace std; const int ...