【题目链接】 http://codeforces.com/problemset/problem/786/A

【题目大意】

  有两个人,每个人有一个数集,里面有一些数,现在有一个环,有个棋子放在1,
  有个不确定位置的终点,两个人轮流从自己的数集中选择一个数,作为这个棋子移动的步数
  问终点在不同位置,不同人先手的时候谁能赢,或者游戏陷入循环

【题解】 

  我们从st_0_0=st_1_0=0开始倒着推导,
  如果一个状态是必败态,那么它的前继节点一定是必胜态
  如果一个点的所有后继都是必胜态,那么这个节点一定是必败态。
  每当一个点被其必胜后继推导到,那么其度数减一,当度数为0时则表示其为必败态
  我们根据这些结论倒着推导每个状态的答案并记录,最后按顺序输出即可。

【代码】

#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
using namespace std;
const int N=100010;
int n,sg[2][N],d[2][N],k,x;
vector<int> g[2];
int dfs(int k,int pos,int v){
int &ret=sg[k][pos];
if(~ret)return ret;
ret=v;
if(v==0){
for(int i=0;i<g[k^1].size();i++){
int x=g[k^1][i];
int j=(pos+n-x)%n;
if(j==0)continue;
dfs(k^1,j,1);
}
}else{
for(int i=0;i<g[k^1].size();i++){
int x=g[k^1][i];
int j=(pos+n-x)%n;
if(j==0)continue;
if(--d[k^1][j]==0)dfs(k^1,j,0);
}
}return ret;
}
int main(){
scanf("%d",&n);
for(int i=0;i<2;i++){
scanf("%d",&k);
g[i].clear();
while(k--){
scanf("%d",&x);
g[i].push_back(x);
}for(int j=1;j<n;j++)d[i][j]=g[i].size();
}memset(sg,-1,sizeof(sg));
dfs(0,0,0);
dfs(1,0,0);
string s[3]={"Loop","Lose","Win"};
for(int k=0;k<2;k++){
for(int i=1;i<n;i++){
printf("%s%c",s[sg[k][i]+1].c_str(),i+1==n?'\n':' ');
}
}return 0;
}

Codeforces 786A Berzerk(博弈论)的更多相关文章

  1. [刷题]Codeforces 786A - Berzerk

    http://codeforces.com/problemset/problem/786/A Description Rick and Morty are playing their own vers ...

  2. cf786a

    title: CodeForces 786A Berzerk data: 2018-3-3 10:29:40 tags: 博弈论 bfs 无限 with draw copyright: true ca ...

  3. ACM 博弈(难)题练习 (第一弹)

    第二弹: 套路&&经验总结: 1. N堆***的游戏,一般可以打表找SG函数的规律.比如CodeForces 603C 2.看起来是单轮的游戏,实际上可能拆分成一些独立的子游戏.比如C ...

  4. Codeforces Round #406 (Div. 1) A. Berzerk 记忆化搜索

    A. Berzerk 题目连接: http://codeforces.com/contest/786/problem/A Description Rick and Morty are playing ...

  5. [Codeforces 1191D] Tokitsukaze, CSL and Stone Game(博弈论)

    [Codeforces 1191D] Tokitsukaze, CSL and Stone Game(博弈论) 题面 有n堆石子,两个人轮流取石子,一次只能从某堆里取一颗.如果某个人取的时候已经没有石 ...

  6. codeforces 1451D,一道有趣的博弈论问题

    大家好,欢迎来到codeforces专题. 今天选择的问题是Contest 1451场的D题,这是一道有趣简单的伪博弈论问题,全场通过的人有3203人.难度不太高,依旧以思维为主,坑不多,非常友好. ...

  7. Codeforces 1411G - No Game No Life(博弈论+生成函数+FWTxor)

    Codeforces 题面传送门 & 洛谷题面传送门 一道肥肠套路的题目. 首先这题涉及博弈论.注意到这里每一个棋子的移动方式都是独立的,因此可以考虑 SG 定理.具体来说,我们先求出每个棋子 ...

  8. Codeforces 1458E - Nim Shortcuts(博弈论+BIT)

    Codeforces 题目传送门 & 洛谷题目传送门 首先看到这样的题我们不妨从最特殊的情况入手,再逐渐推广到一般的情况.考虑如果没有特殊点的情况,我们将每个可能的局面看作一个点 \((a,b ...

  9. Codeforces 549C. The Game Of Parity[博弈论]

    C. The Game Of Parity time limit per test 1 second memory limit per test 256 megabytes input standar ...

随机推荐

  1. git使用笔记(三)文件忽略

    By francis_hao    Nov 19,2016 注:此条所有内容均来自$ git help gitignore,细节请参考之   有时候在仓库里有一些文件我们并不想提交,git提供了指定屏 ...

  2. 从零开始学习MXnet(二)之dataiter

    MXnet的设计结构是C++做后端运算,python.R等做前端来使用,这样既兼顾了效率,又让使用者方便了很多,完整的使用MXnet训练自己的数据集需要了解几个方面.今天我们先谈一谈Data iter ...

  3. 牛客多校对抗第6场 A Singing Contest

    [20分]标题:A.Singing Contest | 时间限制:1秒 | 内存限制:256MJigglypuff is holding a singing contest. There are 2n ...

  4. bzoj2424 [HAOI2010]订货 dp+单调性

    [HAOI2010]订货 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1311  Solved: 884[Submit][Status][Discu ...

  5. 【BZOJ】1579: [Usaco2009 Feb]Revamping Trails 道路升级

    [算法]分层图最短路 [题解] 考虑k层一模一样的图,然后每个夹层都在每条边的位置新加从上一层跨越到下一层的边权为0的边,这样至多选择k条边置为0. 然后考虑方便的写法. SPFA 第一次SPFA计算 ...

  6. linux中链表的使用【转】

    转自:http://blog.csdn.net/finewind/article/details/8074990 Linux下链表的使用方法跟我们常规的不一样,通常情况下,链表的next指针都指向节点 ...

  7. BZOJ1003: [ZJOI2006] 物流运输 trans

    物流运输--看了神犇的题解,就是dp+最短路,设f[i]为1~i天的最少花费,那么 dp[i]=min(cost[1,i],min{dp[j]+cost[j+1,i]+K,1≤j<i}) 就是从 ...

  8. django框架实现restful风格的API开发

    RESTful风格的要求:https://www.cnblogs.com/chichung/p/9933116.html 利用django原生的框架直接做RESTful的API开发是怎样的呢?感受一下 ...

  9. Java 原子性引用 AtomicReference

    http://www.jianshu.com/p/882d0e2c3ea6 实现 原子操作 使用场景: 一个线程使用student对象,另一个线程负责定时读表,更新这个对象.那么就可以用AtomicR ...

  10. python 金字塔图形

    a = 50 y = '*'*(a+1) p = ' ' while a: print(y) y = y[:a-1] y = p + y a = a - 1 for i in range(20): p ...