http://codeforces.com/contest/787/problem/C

题目大意:有一个长度为n的环,第1个位置是黑洞,其他都是星球。已知在星球上(不含第一个黑洞)有一位神。有两个人,每个人有一个集合的数字,两人进行游戏,每人每轮可以让神从一个星球向后移动x位(x为目前两个人所拥有的集合中的一个任意数字,数字可以重复选)。请求出神在2~n的每一个位置上时,两人分别先手的输赢情况,先手胜利输出WIN,先手必败输出LOOS,会无限循环输出LOOP。

思路:经典的有向图博弈(可惜我不会TAT)。

假定范围是[0,n-1],那么定义dp(i, j)表示是第i个人,在第j个位置先手的情况(三种情况,loop,lose,win)。然后我们知道了在dp[0][0] = dp[1][0] = lose是必败的,所以我们反向回去推即可。然后反向推是利用bfs进行的。

①因为对于某个点,如果是必败态,那么他之间的状态都是必胜的

②如果当前点是必胜态,那么他之前的状态中必然有一个点是必败的。那么也就是说,那么必败的点的出度必然为0。

为什么出度为0就是必败呢。因为对于目前的这个状态,他可以往前面转移,假定他有k种转移方法,那么他的出度就是k。那么,我们定义目前的状态是必胜态,那么他转移出去的必然都是必败态。所以,假如说那个是必胜态,那么我们就对k--。如果k是0了,那么表示转移出去的只有必胜态了,所以当前的状态只能是必败态

感觉理解起来还是简单的^0^,开心

//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker,"/STACK:102400000,102400000")
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha printf("haha\n")
const int maxn = + ;
int dp[][maxn];
int cnt[][maxn];
vector<int> ve[];
int n, k; void solve(){
queue<pair<int ,int> > que;
memset(dp, -, sizeof(dp));
dp[][] = , dp[][] = ;///0为必败,1为必胜
que.push(mk(, )); que.push(mk(, ));
while (!que.empty()){
pair<int, int> p = que.front(); que.pop();
int x = p.fi, y = p.se;
if (dp[x][y] == ){
for (int i = ; i < ve[x ^ ].size(); i++){
int nx = x ^ , ny = (p.se + n - ve[x^][i]) % n;
if (dp[nx][ny] == -){
dp[nx][ny] = ; que.push(mk(nx, ny));
}
}
}
else if (dp[x][y] == ){
for (int i = ; i < ve[x ^ ].size(); i++){
int nx = x ^ , ny = (p.se + n - ve[x^][i]) % n;
cnt[nx][ny]--;
if (cnt[nx][ny] == && dp[nx][ny] == -){
dp[nx][ny] = ; que.push(mk(nx, ny));
}
}
}
}
for (int i = ; i < ; i++){
for (int j = ; j < n; j++){
if (dp[i][j] == -) printf("Loop ");
else if (dp[i][j] == ) printf("Lose ");
else printf("Win ");
}
cout << endl;
}
} int main(){
cin >> n >> k;
for (int i = ; i < n; i++) cnt[][i] = k;
while (k--){
int u; cin >> u;
ve[].pb(u);
}
cin >> k;
for (int i = ; i < n; i++) cnt[][i] = k;
while (k--){
int u; cin >> u;
ve[].pb(u);
}
solve();
return ;
}

有向图博弈+出度的结合 Codeforces Round #406 (Div. 2) C的更多相关文章

  1. 【动态规划】Codeforces Round #406 (Div. 2) C.Berzerk

    有向图博弈问题. 能转移到一个必败态的就是必胜态. 能转移到的全是必胜态的就是必败态. 转移的时候可以用队列维护. 可以看这个 http://www.cnblogs.com/quintessence/ ...

  2. Codeforces #Round 406(Div.2)

    来自FallDream的博客,未经允许,请勿转载,谢谢. ------------------------------------------------------- 大家好,我是一个假人.在学习O ...

  3. Codeforces Round #406 (Div. 1) B. Legacy 线段树建图跑最短路

    B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...

  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 Round #406 (Div. 2)滚粗记

    A 一看到题,不是一道解不定方程的裸题吗,调了好久exgcd. 其实一个for就好了啊 B 一直WA ON TEST 7真是烦,一想会不会是编号太大了,又写了一个map版本,无用. 调了好久好久才发现 ...

  6. 维护前面的position+主席树 Codeforces Round #406 (Div. 2) E

    http://codeforces.com/contest/787/problem/E 题目大意:给你n块,每个块都有一个颜色,定义一个k,表示在区间[l,r]中最多有k中不同的颜色.另k=1,2,3 ...

  7. 区间->点,点->区间,线段树优化建图+dijstra Codeforces Round #406 (Div. 2) D

    http://codeforces.com/contest/787/problem/D 题目大意:有n个点,三种有向边,这三种有向边一共加在一起有m个,然后起点是s,问,从s到所有点的最短路是多少? ...

  8. 【转】Codeforces Round #406 (Div. 1) B. Legacy 线段树建图&&最短路

    B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...

  9. Codeforces Round #406 (Div. 1)

    B题打错调了半天,C题想出来来不及打,还好没有挂题 AC:AB Rank:96 Rating:2125+66->2191 A.Berzerk 题目大意:有一个东东在长度为n的环上(环上点编号0~ ...

随机推荐

  1. 20162328蔡文琛 Java课程总结

    20162328 2016-2017-2<程序设计与数据结构>课程总结 一.每周作业.结对编程博客的链接汇总 预备作业01 20162328:表达对专业的期许.浅谈师生关系.对未来学习任务 ...

  2. 03慕课网《vue.js2.5入门》——Vue-cli的安装,创建webpack模板项目

    安装Vue-cli 第一种 貌似不可以,然后用了第二种,但是重装系统后,第二种不能用了,用了第一种可以 # 全局安装vue -cli命令npm install --global vue-cli # 创 ...

  3. Python:内建函数zip

    1.语法 zip([iterable,...]) [说明]:iterable——一个或多个迭代器 2.功能 zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个的元组,然后返回由这 ...

  4. 基础系列(6)—— C#类和对象

    一.类介绍       类(class)是C#类型中最基础的类型.类是一个数据结构,将状态(字段)和行为(方法和其他函数成员)组合在一个单元中.类提供了用于动态创建类实例的定义,也就是对象(objec ...

  5. 让程序运行更加面向用户——电梯V2.1

    电梯V2.1 GitHub仓库地址 Problem 为程序添加命令行参数(自行利用搜索引擎进行学习). 写成 .cpp .h 文件分离的形式(大多数同学已经达到). 继续完善函数分离.模块化思想. 要 ...

  6. 如何打开tensorboard观测训练过程

    TensorBoard是TensorFlow下的一个可视化的工具,能够帮助研究者们可视化训练大规模神经网络过程中出现的复杂且不好理解的运算,展示训练过程中绘制的图像.网络结构等. 最近本人在学习这方面 ...

  7. 如何解决Unsupported Architecture. Your executable contains unsupported architecture '[x86_64, i386]

    APP改版测试后准备Archive发布时,结果居然出现题目中的错误提示.查了一下,如果archive的时候没有选[iOS](http://lib.csdn.net/base/ios)  Devices ...

  8. 1029 C语言文法翻译(2)

    program à external_declaration | program external_declaration 翻译:<源程序>→ <外部声明> | <源程序 ...

  9. 通过一台服务器ssh多台主机远程修改网卡ip

    在多台服务器环境下,更改所有的ip地址,网关,一台一台的登录修改显得复杂繁琐.   知识点: 参考#https://www.cnblogs.com/youngerger/p/9104144.html ...

  10. jenkin报错hudson.plugins.git.GitExcept

    清除工作空间 转载请注明博客出处:http://www.cnblogs.com/cjh-notes/