[Codeforces 1191D] Tokitsukaze, CSL and Stone Game(博弈论) 题面 有n堆石子,两个人轮流取石子,一次只能从某堆里取一颗.如果某个人取的时候已经没有石子,或者取完后又两堆石子个数相同(个数为0也算).假如两人都足够聪明,问谁能赢. 分析 贪心考虑,最后局面一定是0~n-1的一个排列.这时谁取谁就输.因此我把a[i]从小到大排序,把a[i]变成i-1,可以计算出取的石子个数\(\sum (a_i-i+1)\),如果是奇数,则先手胜,否则后手胜. 但…
传送门 不妨把每一堆按照石头数量从小到大排序 注意到每次只能拿一个石头,那么不论何时每堆石头的排名都是一样的 那么最终所有堆的状态一定就是 $0,1,2,...,n-1$,现在每一堆最终的石头数量都确定了 那么我们直接把每一堆的石头数量减去这一堆的排名,再加上 $1$,就得到每一堆能拿走的石头数量 那么此时就可以看成新的一些堆取石头,并且堆之间不要求不相等 显然只要没到最终状态就一定可以再拿石头 直接根据总石头数判断胜负即可 注意到如果不存在超过一对堆初始石头数量一样那么每一堆的石头数量一定不小…
D. Tokitsukaze, CSL and Stone Game time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard output Tokitsukaze and CSL are playing a little game of stones. In the beginning, there are n piles of stones, the i-…
去吧,皮皮虾 题意:  有 n 堆石子,每堆有 a[ i ] 个,然后每次 操作 可以选择任意一堆 石子,取走一个. 若你取完了之后,存在两堆石子,他们的个数一样多,你就输了( 包括两堆都是0个), 或者你不能取了,你也输了. 解: 1.若只有一堆,那就判奇偶就行了. 2.若存在 至少 两对 相等个数的 堆, 或者 两堆个数 为0 的堆,或者3堆石子都相等,先手必败( 两对的话,至多只能 使一对,变成不等的.) 3. 按升序排序,若存在两堆个数相等,都为 a,且有一堆的石子数为 a - 1 那么…
思路: 首先题目告诉我们,一次只能删去一个石子.当然有翻译时会注意,但是看英文题时总是容易忽略.. 先排序. 然后,你会发现,有些情况是一开始就输的,具体情况如下: 有两个 两个相等非零数.(a[x] == a[x+1], a[y] == a[y+1], x != y) 有两个零. (a[x] == a[y] == 0) 有一个(a[x] + 1 == a[x+1] == a[x+2]),此时也直接输. 判完后,可以证明,无论他们怎么取,只要不使自己输,都会形成类似序列{0,1,2,3,...}…
https://codeforc.es/contest/1191/problem/E 参考自:http://www.mamicode.com/info-detail-2726030.html 和官方题解. 首先这种组合游戏,必定存在一种不败策略.一种很直观的理解就是,假如没有办法一开始就胜利,那么就优先考虑和局的. 假如有连续k个一样的,那么先手可以进行一次无效翻转变成后手,所以这种情况先手必然至少和局.这样的话一次翻转之后就必然有连续k个一样的,后手也必定有了至少和局的机会,他也进行一次无效翻…
Codeforces 题面传送门 & 洛谷题面传送门 一道肥肠套路的题目. 首先这题涉及博弈论.注意到这里每一个棋子的移动方式都是独立的,因此可以考虑 SG 定理.具体来说,我们先求出每个棋子放在每个位置的 SG 函数--这个是非常好求的,具体方法就是建反图拓扑排序,求集合的 MEX 时可以 map 存,也可以直接枚举,复杂度 \(m\sqrt{m}\) 或 \(m\sqrt{m}\log m\)(反正我使用的 map 没有 TLE 就是了) 于是问题转化为,有多大概率满足开始游戏时,所有棋子放…
A Lot of Games 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/J Description Andrew, Fedor and Alex are inventive guys. Now they invent the game with strings for two players. Given a group of n non-empty strings. During the game two player…
A Funny Stone Game 题意: $n \le 23$堆石子,每次选择$i < j \le k$,从$i$拿走1颗$j,k$各放入一颗,不能取就失败.求先手是否必胜以及第一次取的策略 一开始一直在想游戏怎么会结束...眼残没发现$i<j.....$ 然后,解这类组合游戏问题重要的一步是发现独立的子游戏 本题中每个石子是互不影响的 $sg[i]$为一颗在$i$的石子的状态 $sg[i]=mex\{sg[j] \oplus sg[k]\}$ 然后就$\oplus$起来就行了 #incl…
  Imagine that Alice is playing a card game with her friend Bob. They both have exactly 88 cards and there is an integer on each card, ranging from 00 to 44. In each round, Alice or Bob in turns choose two cards from different players, let them be aa…
传送门 注意到后手可以模仿先手的操作,那么如果一回合之内没法决定胜负则一定 $\text{once again!}$ 考虑如何判断一回合内能否决定胜负 首先如果最左边和最右的 $0$ 或 $1$ 距离小于等于 $k$,那么先手显然赢 如果最左边和最右的 $0$ 和 $1$ 中间都差了大于等于 $k$ 个位置,那么考虑后手能不能赢 枚举一下先手第一步即可(代码因为比赛是写的,比较奇怪,我感觉也不用参考代码吧..) #include<iostream> #include<cstdio>…
https://codeforces.com/contest/1191/problem/F 看了一下题解的思路,感觉除了最后一段以外没什么启发. 首先离散化x加快速度,免得搞多一个log.其实y不需要离散化. 规定无穷大就是xn+1这个很好理解嘿嘿.(反正开多了5个不怕) 注意到其实从上往下一行一行扫过去,每次必须新增的元素才是新的集合,那很容易想到一个不重不漏的办法就是每次计算"以点p[i]为加进去的新点中的结束的集合",那么假设一开始p[i]的左侧有cntl个点,那么显然有(cnt…
https://codeforces.com/contest/1191/problem/C 一开始想象了一下,既然每次删除都是往前面靠,那么好像就是页数*页容量+空位数=最多容纳到的坐标. 至于为什么呢?好像是每次都会删除干净的原因,从第一页开始考虑,第一页可以容纳到5,这个很显然. 删除之后有2个空位,然后可以容纳到7.再把7也删除,就可以容纳到8. 那么每次就暴力删除特殊元素就可以了,反正最多就是m个. 问题在于翻页的时候不能够简单的curpage++,这样必定翻车.我是直接二分,因为顶多就…
https://codeforces.com/contest/1191/problem/B 小心坎张听的情况. #include<bits/stdc++.h> using namespace std; string s[3]; int main() { #ifdef Yinku freopen("Yinku.in", "r", stdin); //freopen("Yinku.out", "w", stdout);…
题意:有一个长为n的01串,两个人轮流操作,每个人可以把某个长度为m的区间变成相同颜色,谁在操作后整个串颜色相同就赢了.问最后是谁赢?(有可能平局) 思路:容易发现,如果第一个人不能一击必胜,那么他就会向平局发展.同理,如果第二个人不能在第一个人的所有第一步的可能走法之后都能一击必胜,那么他也会向平局发展.所有,问题转化为了第一个人能不能一击必胜,第二个人能不能在第一步的所有走法之后一击必胜. 先考虑第一个人,我们只要判断能不能找到一个区间,使得这个区间的颜色相同之后,向左右延伸可以到串的两端即…
题目链接:http://codeforces.com/problemset/problem/1191/B 题意:类似于麻将,三个一样花色一样数字的,或者三个同花顺就赢了,新抽的能当任何类型,问至少几个. 思路:分类判断即可. AC代码: #include<bits/stdc++.h> using namespace std; bool check(int x,int y,int z) { && abs(y-z) == ) return true; && abs(…
题目链接:http://codeforces.com/problemset/problem/1191/A 思路:枚举 16 种情况输出最高的就行. AC代码: #include<bits/stdc++.h> using namespace std; int main() { int n; cin >> n; char c = 'D'; ; ;i < ;i++) { == ) ans = i,c = 'A'; == && c > 'A') ans = i,…
Tokitsukaze and Discard Items time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Recently, Tokitsukaze found an interesting game. Tokitsukaze had nn items at the beginning of this game. Howeve…
思路: 这就是K倍动态减法游戏,可以参考曹钦翔从“k倍动态减法游戏”出发探究一类组合游戏问题的论文. 首先k=1的时候,必败态是2^i,因为我们把数二进制分解后,拿掉最后一个1,那么会导致对方永远也取不完,我们可以拿到最后一个1. k=2的时候,必败态是斐波那契数列,因为任何一个整数n都可以写成两项斐波那契数的和,所以我们拿掉1,对方永远取不完高两位的数. k的时候我们必须构造数列,将n写成数列中一些项的和,使得这些被取到的项的相邻两个倍数差距>k 那么每次去掉最后一个1 还是符合上面的条件.设…
那么对于这题对于每一堆,放石子放满就想当于满的时候取s-c个,反向只是让我理解题意更深. 首先我们知道(S,S)这个局面是必败局面.对于每一堆能加的数量有限,而当c的值(大于或者等于) D=sqrt(s) 或者 D=sqri(s)+1的时候就可以一次完成,就是说可以从当前局面到达(S,S)的局面, 所以当前局面是必胜局面.而这种情况下,你能造成的局面有集合A={0,1,2,...,s-c-1}:因为你可以去 s-c,s-c-1,s-c-2,.....,1:那么对应mex(x)函数(即A中未出现的…
思路:由于数据很大,先通过打表找规律可以知道, 当n为偶数的时候其SG值为n/2; 当n为奇数的时候一直除2,直到为偶数m,则SG值为m/2; 代码如下: #include<stdio.h> int cal(int m) { ) m>>=; ; } int main() { ,a; scanf("%d",&t); while(t--){ scanf("%d",&n); ; ;i<n;i++){ scanf("%…
传送门 注意到矩形往上是无限的,考虑把点按 $y$ 从大到小考虑 对于枚举到高度为 $h$ 的点,设当前高度大于等于 $h$ 的点的所有点的不同的 $x$ 坐标数量为 $cnt$ 那么对于这一层高度 $h$ 我们就有 $cnt(cnt+1)/2$ 种不同的 $l$,$r$ ,使得矩形内点集不同 发现对于某些 $x$ 在这一层相邻两点之间,高度大于 $h$ 的点,这样又重复算了它们的贡献,所有要再扣掉 直接用树状数组维护一下当前区间内不同的 $x$ 的数量即可 因为离散化了判断 $x$ 是否出现过…
传送门 显然从左到右考虑每个要删除的数 维护一个 $cnt$ 表示之前已经删除了 $cnt$ 个数,那么当前所有要删除数的实际位置就要减去 $cnt$ 直接暴力枚举哪些数在最左边一个块然后一起删除 每个数删除一次复杂度 $O(n)$ #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace st…
Preface 军训终于结束了回来补一补之前的坑发现很多题目题意都忘记了 这场感觉难度适中,F由于智力不够所以弃了,E的话石乐志看了官方英文题解才发现自己已经胡了一大半就差实现了233 水平下降严重.jpg A. Tokitsukaze and Discard Item CNM我SB模拟题要WA那么多发还是退役算了万恶的long long #include<cstdio> #define RI register int #define CI const int& const int N…
A:Tokitsukaze and Enhancement 当时看错条件了..以为A>C>B>D.就胡写了判断条件. #include<bits/stdc++.h> using namespace std; bool work(int a,int b) { ) return false; ) return true; &&(b==||b==||b==)) return true; &&(b==||b==)) return true; &…
D. Tokitsukaze, CSL and Stone Game 题意:有n堆石头,每人每次只能去一颗石子,若轮到当前人没任何一堆石子可以取或当前人取到后剩下有俩堆石子个数相同则当前人输: 给定石子序列. 分析:1.若有类似“2 3 3 ”则后手胜,因为有这个序列就必须在这个序列中去石子(因为如果在这个序列以外取子,则会导致输的后者情况),但在这个序列中取不到可解情况,所以该状态为必败态: 2.若序列中有俩对相同的石子,则后手胜: 3.除1.2情况外就把利用sum+起来,每个加就+a[i]-…
一.题目 ​ Tokitsukaze, CSL and Stone Game ​ Tokitsukaze和CSL正在玩一些石头游戏. ​ 一开始,有n堆的石头,第i堆石头数记为 \(a_i\),两人轮流操作. Tokitsukaze先行动. 在每个回合中,玩家选择非空的一堆石头并从中移除一块石头. 如果在操作前每堆都是空的,或者如果在移除石头之后,有两堆(可能是空的)包含相同数量的石头,则该玩家输了. 假设两位球员都采取最优方案,谁将赢得比赛? ​ 考虑一个例子: n = 3,\(a_1\)=2…
\(CodeForces 706E ~Working routine\) 给出一个矩阵,每次操作交换两个子矩阵,求最后状态. 使用链表存储,每次交换后,影响到的之后矩阵边缘的指针,暴力修改. \(~~~~\) \(CodeForces 985E ~Pencils and Boxes\) 每个铅笔盒至少放\(k\)个铅笔,每个盒子中的铅笔价值的绝对值之差不能超过\(d\).求是否有方案. 放在一个盒子里的铅笔价值是连续的一段,这样一定不劣.使用线段树维护合法的权值起始位置. \(~~~~\) \(…
大意: 给定01串, 两人轮流操作, Tokitsukaze先手. 每次操作可以选择长为$k$的区间, 全部替换为$0$或$1$, 若替换后同色则赢. 求最后结果. 先判断第一步是否能直接赢, 不能的话若所有后继都是必败则必败, 否则平局. 正确性很显然, 因为一次操作不能直接赢的话, 只要模仿对手操作一定能平局. 那么问题就转化为判断一步操作后是否能赢. 假设$0$的最大范围为$[L[0],R[0]]$,$1$的最大范围为$[L[1],R[1]]$, 那么只要操作前$R[0]-L[0]+1\l…
大家好,欢迎来到codeforces专题. 今天选择的问题是Contest 1451场的D题,这是一道有趣简单的伪博弈论问题,全场通过的人有3203人.难度不太高,依旧以思维为主,坑不多,非常友好. 题目链接:https://codeforces.com/contest/1451/problem/D 废话不多说,我们直接来看问题. 题意 从前有两个人,一个叫Utkarsh,另外一个叫Ashish.这两个名字看起来有点怪,我猜可能出题人是老毛子的原因,老毛子的问题当中这两个名字经常出现.也许类似于…