题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2066

题意:
有mm个格子排成一行,从左到右编号11到mm,其中nn个给定的格子里有石子,且编号为mm的格子里没有石子。
两个人轮流操作,每次操作要求选择一个石子,石子会移动到它右边第一个不含石子的格子里。
将某个石子移动到编号为mm的格子的人胜利,问先手有多少种操作方案能使先手必胜。
2≤m≤109,1≤n≤106,n<m2 \leq m \leq 10^9, 1 \leq n \leq 10^6, n

题解:
如果存在石子放在编号为(m−1)(m−1)的格子,那么这个石子以及与这个石子相邻的石子都可以一步移动到编号为mm的格子。
否则先手不存在一步可以胜利的方案(此时n≤m−2n\leq m-2),为了防止对方获胜,每个人都会尽量不将石子放到编号为(m−1)(m−1)的格子中。
该种情况下,如果先手占据了(m−n−1)(m−n−1)到(m−2)(m−2)这nn个格子,则后手只能移动一个石子到编号为(m−1)(m−1)的格子,从而先手可以胜利,于是只用考虑将nn个石子移动至(m−n−1)(m−n−1)到(m−2)(m−2)这nn个格子的问题,这转化为:移动完最后一个石子的人胜利。
设从左往右第ii个石子到(m−2)(m−2)这个格子之间没有石子的格子数量为fif_i,则fif_i非降,而且每次操作只能使一段连续相同的fif_i减11。
设cic_i表示fj=if_j=i的数量,每次操作相当于选择两个正整数ii和xx,满足x∈(0,ci]x \in (0, c_i],使得cic_i减少xx,ci−1c_{i-1}增加xx,将c0c_0之外的cic_i恰好全变为00的一方胜利,所以获胜方的最后操作必然是关于c1c_1的,而且每次操作会和ii的奇偶性有关系。
考虑奇数ii情况的cic_i异或和作为SGSG值,SGSG不为00则存在先手必胜方案,先手对奇数cic_i的操作必胜需要满足SG⊕ci∈[0,ci)SG\oplus c_i \in [0, c_i),先手对于偶数cic_i的操作必胜需要满足(SG⊕ci−1)−ci−1∈(0,ci](SG\oplus c_{i-1})-c_{i-1} \in (0,c_i]。

代码:

#include <cstdio>
const int maxn = 1000001;
int m, n, a[maxn], tot, b[maxn], sg, cnt;
int main()
{scanf("%d%d", &m, &n);for(int i = 0; i < n; ++i)scanf("%d", a + i);if(a[n - 1] == m - 1){for(int i = n - 1; i >= 0 && a[n - 1] - a[i] == n - 1 - i; --i, ++cnt);printf("%d\n", cnt);return 0;}for(int i = 0; i < n; ++i){a[i] = m - 1 - a[i] - (n - i);if(!a[i])break;if(!i || a[tot - 1] > a[i])a[tot++] = a[i];++b[tot - 1];}for(int i = 0; i < tot; ++i)if(a[i] & 1)sg ^= b[i];for(int i = 0; i < tot; ++i)if(a[i] & 1){if((sg ^ b[i]) < b[i])++cnt;}else{int last = i + 1 < tot && a[i + 1] == a[i] - 1 ? b[i + 1] : 0;if((sg ^ last) > last && (sg ^ last) <= last + b[i])++cnt;}printf("%d\n", cnt);return 0;
}

BZOJ 2066 [Poi2004]Gra相关推荐

  1. BZOJ 2073: [POI2004]PRZ( 状压dp )

    早上这道题没调完就去玩NOI网络同步赛了.... 状压dp , dp( s ) 表示 s 状态下所用的最短时间 , 转移就直接暴力枚举子集 . 可以先预处理出每个状态下的重量和时间的信息 . 复杂度是 ...

  2. bzoj2066: [Poi2004]Gra

    传送门:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2066 思路:首先谁移到m-1谁就输了,这是多么显然啊.... 其实这个可以转化为上一 ...

  3. Bzoj 2073 [POI2004]PRZ

    2073: [POI2004]PRZ Time Limit: 10 Sec  Memory Limit: 64 MB Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们 ...

  4. bzoj 2073: [POI2004]PRZ

    2073: [POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上的 ...

  5. BZOJ 2073: [POI2004]PRZ 状压动归

    2073: [POI2004]PRZ Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 315  Solved: 237 [Submit][Status] ...

  6. [POI2004]GRA

    Description 让我们考虑一个在m x 1 的板子上玩的游戏,板子被从1 到 m编号. 现在板子上有n 个棋子, 每个都严格占据板子上的一个格子. 没有一个棋子占据格子m. 每个单独的移动遵循 ...

  7. bzoj 2075: [POI2004]KAG

    整天鬼畜题搞搞,感觉药丸-- 这种题出到xjoi模拟题里,太神了-- 这题的核心在于分割Cograph,尝试把Cograph的合成过程给求出来. 我们将这张图中的边定为黑边,在这张图的补图中出现的边定 ...

  8. BZOJ 2069: [POI2004]ZAW(Dijkstra + 二进制拆分)

    题意 给定一个有 \(N\) 个点 \(M\) 条边的无向图, 每条无向边 最多只能经过一次 . 对于边 \((u, v)\) , 从 \(u\) 到 \(v\) 的代价为 \(a\) , 从 \(v ...

  9. bzoj 2096 [POI2004]ZAW——二进制枚举

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2069 可以把直接相连的点分成  从1点出的一部分  和  走向1点的一部分.多起点最短路就和 ...

最新文章

  1. 美国任命首位首席信息安全官
  2. 到底一台服务器能够支持多少TCP并发连接?
  3. Practice:在2008 core上部署和管理DHCP服务器
  4. Qt connect信号连接的几种写法
  5. pat1011-1020
  6. CC++——基本说明
  7. POJ 3250 Bad Hair Day【单调队列】
  8. 删除win10开始菜单中程序的目录
  9. Java 异常处理的 20 个最佳实践,你知道几个?| CSDN 博文精选
  10. 【Flutter】基础组件【02】Container
  11. android 动态设置priority,Android属性之android:priority
  12. mysql 年龄计算(根据生日字段)
  13. Oracle 临时表空间 SQL语句
  14. Mac OSX x86 10.4.6 安装小记(1)
  15. acrobat PDF删除部分_pdf转word怎么转教程
  16. 求问解决方法,感激不尽
  17. mysql端口3309_为mysql添加端口号为3309的实例:
  18. web前端学习26(锚点链接)
  19. 常见Oracle错误都在这了: ORA-00257/ORA-00313/ORA-28000/ORA-28000
  20. 安装Visual Studio Scrum 1.0过程模板

热门文章

  1. 32bit和64bit的区别
  2. python应用(1)两百行代码实现微信好友数据爬取与可视化
  3. 不用table标签实现表格
  4. 解决VIVO系列热点自动关闭
  5. STM32F1做RSA,AES数据加解密,MD5信息摘要处理
  6. 安卓pubg服务器维修中,pubg服务器维护中
  7. 练习--手机产品信息--函数、文件读写
  8. 全国计算机技术与软件专业技术资格(软考)考试介绍
  9. 假如把二维码类似的标签识别技术做成语音片段,优势劣势有哪些?
  10. 我通过Python做副业每个月收入30000+,这绝对是2023最赚钱的副业