博弈
文章平均质量分 53
issue是fw
19 years old, struggling in life, chasing daydreams.
展开
-
AtCoder Beginner Contest 209 E - Shiritori(博弈,图)
LINKTakahashi先手(叫做小TTT),Aoki后手(叫做小AAA)每个人轮流说一个单词,这个单词的前三个字母必须等于上一个单词的后三个字母现在问当小TTT说出的第一个单词为sis_isi时,能否获得胜利??可以O(n2)O(n^2)O(n2)暴力枚举两点间是否有边,但是复杂度太高考虑每个单词只有前三个字母和后三个字母有用把前三个字母浓缩成一个点,后三个字母浓缩成一个点那么单词sis_isi(设长度为lll)就表示能从{s1,s2,s3}\{s_1,s_2,s_3\}{s1,s原创 2021-09-16 12:18:18 · 320 阅读 · 0 评论 -
2021牛客暑期多校训练营1 Alice and Bob(结论,sg打表|优化)
LINKAliceAliceAlice和BobBobBob做游戏,AliceAliceAlice先手.每次每个人可以从其中一堆拿走k(k>0)k(k>0)k(k>0)个石子,同时从另一堆拿走s∗k(s>=0)s*k(s>=0)s∗k(s>=0)个石子谁不能操作谁就输了,问胜负情况.容易想到定义f[i][j]f[i][j]f[i][j]表示两堆式子分别剩下i,ji,ji,j个的胜负情况可以暴力枚举转移,复杂度为O(n3log(n))O(n^3log(n))O(原创 2021-08-05 12:28:18 · 234 阅读 · 0 评论 -
2019 China Collegiate K. MUV LUV UNLIMITED(思维,博弈)
LINK题意两个人玩游戏,每次可以删除树上至少111个叶子节点无法操作的人输,求先后手的胜负情况①.当只有一条链的时候,点数奇数先手胜,偶数后手胜利②.当存在多条链时Ⅰ.若某个叶子节点xxx存在兄弟节点yyy,那么先手必胜。证明若删去xxx是必败态那么就删去,先手必胜若删去xxx后是必胜态,后手可以采用点集为sss的删除策略来必胜那么先手删去x+sx+sx+s后是必败态,先手必胜。且因为点集sss不存在xxx的父亲,所以先手可以操作点集x+sx+sx+sⅡ.当不存在叶子节点有兄弟节原创 2021-05-19 21:09:30 · 235 阅读 · 0 评论 -
牛客练习赛63 F.牛牛的树行棋(启发式合并+sg打表)
LINK假设只有一枚棋子,那么这枚棋子在叶子节点的sgsgsg值显然是零其他节点可以sgsgsg打表推出来,由于只需要子树内的sgsgsg值,似乎需要用到启发式合并计算但是我们发现叶子节点是sgsgsg是零,说明叶子节点的父亲至少是111…一个点的sgsgsg值取决与子树内深度最大的叶子节点于是可以O(n)O(n)O(n)直接先算出来现在求先手第一步也多少种方案移动使得先手必胜也就是移动完之后sgsgsg值需要变成零如果节点xxx的sgsgsg值是sg[x]sg[x]sg[x],当前总的sgs原创 2021-03-09 13:07:02 · 188 阅读 · 0 评论 -
2020 CCPC Wannafly 纳新一百的石子游戏(NIM博弈原理)
LINK做出这题需要对nimnimnim博弈的原理比较了解,关于nimnimnim博弈我写过一篇证明nim博弈的一点证明如果先手能赢,当前状态必定是奇状态,设二进制是奇的最高位是xxx我们需要变到偶数状态,就必然要把xxx这一位取反,所以方案数是所有第xxx位二进制是111的个数#include <bits/stdc++.h>using namespace std;#define int long longconst int maxn = 2e5+10;int n,a[maxn原创 2021-03-05 18:38:28 · 173 阅读 · 0 评论 -
HDU3980 Paint Chain(SG函数)
传送门nnn个点围成一个环,每次每个人可以把连续的mmm个点染色无法操作的人失败, 问胜负情况很明显第一个人操作过后,环就变成了一条链所以可以定义sg[x]sg[x]sg[x]为链长xxx的sgsgsg值那么显然sg[k]=0 (k∈[0,m−1])sg[k]=0\ (k\in[0,m-1])sg[k]=0 (k∈[0,m−1])然后枚举先手第一次把链变成长n−mn-mn−m所以我们求sg[n−m]sg[n-m]sg[n−m]是后手的胜负状态注意特判n<mn<原创 2021-02-18 08:46:10 · 230 阅读 · 0 评论 -
HDU1730 Northcott Game(NIM博弈变形)
传送门Orz我太菜了一直在想SGSGSG函数没往nimnimnim博弈上想虽然nimnimnim博弈也算是sgsgsg函数…先单独考虑一行的胜负情况如果一个人把棋子移向远离对手的方向,是没有意义的因为下一次对手可以移动任意距离,也就是离自己多远都可以那么只有棋子初始的中间距离有用每次可以把中间距离缩小若干,缩到不能缩为止然后就是一个nimnimnim博弈了#include <bits/stdc++.h>using namespace std;int n,m;int ma原创 2021-02-17 16:48:57 · 229 阅读 · 1 评论 -
POJ 3537.Crosses and Crosses(定义sg函数)
传送门题意nnn个格子,每次每个人可以在一个空闲格子放上一个×当一个人操作完后出现连续三个叉时就赢了,问先手的胜负状况我们在pospospos位置放了×后,相当于把局面分成了两半因为pos−1,pos−2,pos+1,pos+2pos-1,pos-2,pos+1,pos+2pos−1,pos−2,pos+1,pos+2都不能放格子了一旦放了自己就输了所以局面分成长度为max(0,pos−3)max(0,pos-3)max(0,pos−3)和长度为max(0,n−pos−2)max(0,n-p原创 2021-02-17 16:04:41 · 252 阅读 · 0 评论 -
POJ2311 Cutting Game(sg函数必胜态节点)
传送门博弈问题首先需要确定必败态由于(1,x)(1,x)(1,x)和(x,1)(x,1)(x,1)都是必胜态所以转移到必胜态的都是必败态所以(2,2),(2,3),(3,2)(2,2),(2,3),(3,2)(2,2),(2,3),(3,2)无论如何都会转移到必胜态,所以初始化他们的sgsgsg值#include <iostream>#include <set>#include <cstring>using namespace std;int sg[20原创 2021-02-17 15:10:15 · 235 阅读 · 0 评论 -
魔法珠(sg函数)
魔法珠题意有nnn堆魔法珠,每次可以选择一堆大于111的任意一堆设这堆魔法珠有mmm个约数分别为b1,b2,b3...bmb_1,b_2,b_3...b_mb1,b2,b3...bm那么把这堆石子分解为这mmm堆的任意m−1m-1m−1堆石子,所以一次操作后会增加m−2m-2m−2堆石子最后,谁不能操作谁就输了ai,n<=1000a_i,n<=1000ai,n<=1000定义sg[i]sg[i]sg[i]为一堆石子有iii个时的sgsgsg值那么iii能到达的状原创 2021-02-17 14:12:36 · 321 阅读 · 0 评论 -
HDU1848 Fibonacci again and again(SG函数)
传送门SGSGSG函数的模板题#include <bits/stdc++.h>using namespace std;const int maxn = 3e5+10;int n,m,p,sg[maxn],ok[maxn],f[maxn];int main(){ f[1] = f[2] = 1; for(int i=3;i<=20;i++) f[i] = f[i-1]+f[i-2]; for(int i=1;i<=1000;i++) { for(int j=1原创 2021-02-17 13:49:22 · 215 阅读 · 1 评论 -
NIM博弈的简洁证明
P2197 【模板】nim游戏nnn个正整数按位相加,不进位若每一位都是偶数即为偶状态,否则成为奇状态显然,结束状态是偶状态任意偶状态必须转移到奇状态这个非常显然,我任取一个数xxx把他变成yyy一定有若干位的二进制从111变成了000或者从000变成了111所以转移到了奇状态任意奇状态总有办法转移到偶状态设这个奇状态在nnn个二进制位上的奇的,从高位到低位分别是id1,id2,id3...idnid_1,id_2,id_3...id_nid1,id2,id3...idn那么一定原创 2021-02-17 11:44:13 · 264 阅读 · 0 评论 -
牛客练习赛67 C.牛牛爱博弈(规律思维,证明)
传送门nnn个石子,每个人每次可以拿1,2,4,8,16....1,2,4,8,16....1,2,4,8,16....个拿走最后一颗石子的胜利,问先手必胜还是必败。吐槽感觉不是非常好想的一题,现场却被过穿…吐了观察发现,当n=1,n=2n=1,n=2n=1,n=2时显然是先手赢否则,n=3n=3n=3是一个关键点因为只要n>=3n>=3n>=3,最后一定会走到n=3n=3n=3这个关键点证明如下,当场上只剩下l,rl,rl,r有111,当前操作的那个人永远不会单独拿走l原创 2021-02-07 11:26:14 · 276 阅读 · 0 评论 -
牛客练习赛41 A-翻硬币游戏(巧妙博弈)
传送门我是个fwfwfw,过了800+800+800+的题不会写,我是fwfwfw先转化一下,把所有硬币翻成反面等价于每个硬币翻奇数次因为mmm是偶数,所有当nnn是奇数时奇数个奇数还是奇数,所以总共翻的次数是奇数而每次只能翻偶数,所以无解当nnn是偶数时偶数个奇数是偶数,所以总共翻得次数是偶数每次只能翻偶数,所以是可能有解的但是由于BobBobBob的干涉,会多进行一次操作所以任何时刻操作次数都是奇数,这显然与答案的奇偶性不同#include <bits/stdc++.h&g原创 2020-12-27 21:00:52 · 402 阅读 · 0 评论 -
牛客小白月赛16. A小石的签到题(博弈)
传送门手玩一下并没有找到什么规律…考虑消掉[1,n][1,n][1,n]的数字无论一开始选择[1,n][1,n][1,n]任何一个数字,都会把111连带消掉相当于消除掉[2,n][2,n][2,n]的所有数字但是当一开始选择数字111时,这不连带消除的,所以局面一定是和上面对立的所以,先手有选111和不选111两种决策,已经包含了获胜的所有可能特判n=1n=1n=1时先手必输,否则必胜#include <iostream>int main(){ int n; scanf("原创 2020-12-11 16:26:29 · 271 阅读 · 1 评论 -
牛客小白月赛13: 小A取石子(nim博弈裸题)
传送门就是nimnimnim博弈的裸体,没什么好说的了#include <bits/stdc++.h>using namespace std;int main(){ int n,k; cin >> n >> k; int x = 0,flag = 0; for(int i=1;i<=n;i++) { int jk; cin >> jk; if( jk>=k ) flag原创 2020-12-11 12:26:36 · 780 阅读 · 0 评论