4035: [HAOI2015]数组游戏 Time Limit: 15 Sec  Memory Limit: 32 MBSubmit: 181  Solved: 89 Description 有一个长度为N的数组,甲乙两人在上面进行这样一个游戏:首先,数组上有一些格子是白的,有一些是黑的.然 后两人轮流进行操作.每次操作选择一个白色的格子,假设它的下标为x.接着,选择一个大小在1~n/x之间的整数 k,然后将下标为x.2x.....kx的格子都进行颜色翻转.不能操作的人输.现在甲(先手)有一些询…
目录 @description@ @solution@ @accepted code@ @details@ @description@ 有一个长度为N的数组,甲乙两人在上面进行这样一个游戏: 首先,数组上有一些格子是白的,有一些是黑的.然后两人轮流进行操作.每次操作选择一个白色的格子,假设它的下标为x.接着,选择一个大小在1~n/x之间的整数k,然后将下标为x.2x.....kx的格子都进行颜色翻转.不能操作的人输. 现在甲(先手)有一些询问.每次他会给你一个数组的初始状态,你要求出对于这种初始…
这题显然把每个白格子看成一个子游戏 一个白格子$x$的$sg$值是$mex{[0,sg[2x],sg[2x] XOR sg[3x].....]}$ 打表发现一个数的$sg$值只和$n/x$有关,然后分块乱搞就行了. 一开始开了个$map$,一直$TLE$,换成两个数组就过了. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <c…
题目大意: 有一排n个格子,每个格子上都有一个白子或黑子,在上面进行游戏,规则如下: 选择一个含白子的格子x,并选择一个数k,翻转x,2x,...,kx格子上的子. 不能操作者负. 思路: 将“某个格子上有一个白子 ”视作游戏的一个状态. 对于状态x,sg(x)=mex{sg(2x),sg(2x)^sg(3x),sg(2x)^sg(3x)^...^sg(kx)}. 由于SG函数的取值只与棋盘大小和棋子位置有关,因此我们可以记忆化. 然后我们就有了暴力构造SG函数的程序,实测只能过40%的点,大力…
[BZOJ4035]数组游戏(博弈论) 题面 BZOJ 洛谷 题解 很明显是一个翻硬币游戏的变形,因此当前局面的\(SG\)函数值就是所有白格子单独存在的\(SG\)函数的异或和. 那么,对于每一个位置考虑\(SG\)函数. \(SG(x)=mex_{i=1}^{n/x}\{\oplus_{j=1}^i SG(jx) \}\) 这种东西很不好算,直接打个表, 发现对于所有\(n/x\)相同的数,他们的\(SG\)函数都是相同的. 那么数论分块一下就只有\(O(\sqrt n)\)个有效的的\(S…
BZOJ 1444:[JSOI2009]有趣的游戏 题目链接 首先我们建出Trie图,然后高斯消元. 我们设\(f_i\)表示经过第\(i\)个点的期望次数: \[ f_x=\sum i\cdot p_x(i) \] \(p_x(i)\)表示经过第\(x\)个点\(i\)次的概率.我们设表示一个单词的节点为关键节点,则所有关键节点只会经过一次,也就是说\(f_{关键}=p_{关键}(1)\),也就是我们要求的答案. \[ \displaystyle f_x=\sum_{y与x相连}rate_{y…
bzoj 5393 [HAOI2018] 反色游戏 Link Solution 最简单的性质:如果一个连通块黑点个数是奇数个,那么就是零(每次只能改变 \(0/2\) 个黑点) 所以我们只考虑偶数个黑点的连通块 如果是一棵树,那么方案只有一种,因为所有叶子颜色都确定,可以自底向上一层层推出每一条边是否反色 下面考虑一个图,随便找一棵生成树,那么如果其他非树边都不反色就只有一种.假设其它非树边是否反色都已确定,那么相当于这棵生成树的每个点的初始颜色确定,所以每一种非树边的选取方案都对应着一种反色方…
BZOJ 洛谷 低估这道神题了_(:з」∠)_ MilkyWay好狠啊(小声) \(Description\) 有一些数字,被分成若干双端队列(从两边都可以取)和最多两个栈(只能从某一边一个一个取)的形式.两人轮流取这些数字,每个人都想最大化自己取到的数字和,求最后两人各能取到多少. \(n\leq10^6\). \(Solution\) 对于最左边的栈,如果有\(A_1\geq A_2\),那么先手取了\(A_2\),后手一定会取走\(A_1\)(如果赚,显然后手要取:如果不赚,先手可以取别的…
题目描述 有一个长度为N的数组,甲乙两人在上面进行这样一个游戏:首先,数组上有一些格子是白的,有一些是黑的.然 后两人轮流进行操作.每次操作选择一个白色的格子,假设它的下标为x.接着,选择一个大小在1~n/x之间的整数 k,然后将下标为x.2x.....kx的格子都进行颜色翻转.不能操作的人输.现在甲(先手)有一些询问.每次他 会给你一个数组的初始状态,你要求出对于这种初始状态他是否有必胜策略.   输入格式 接下来2*K行,每两行表示一次询问.在这两行中,第一行一个正整数W,表示数组中有多少个…
我们只要看出来这道题 数组表示的含义就是 某个点到根节点路径权值和就行 那么我们可以把最终答案 看做 k*x+b x就是其深度 ,我们发现dfs序之后,修改一个点是差分一个区间,修改一个点的子树,可以看做对于子树中的每一个点进行 a*(deep[x]-deep[root]+1) root是子树根节点,那么我们对 k 用a差分区间 对b用 -a*(deep[root]-1)差分区间 #include<cstdio> #include<cstdlib> #include<iost…