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. “献给爱读书的中国人”——Amazon Kindle软件测评

    “献给爱读书的中国人” ——Amazon Kindle软件测评 前不久我在网上看到了一篇印度工程师旅居上海时发表的一篇文章,题目叫做<令人忧虑:不阅读的中国人>,大致讲述的是世界上人们在飞 ...

  2. 第14章 Linux账号管理与ACL权限设置

    Linux的账号与用户组 用户标识符:UID与GID 每一个文件都有一个所有者ID和用户组ID,当我们需要查看文件属性时,系统会根据/etc/passwd和/etc/group的内容,找到对应UID和 ...

  3. 201621123037 《Java程序设计》第10周学习总结

    作业10-异常 标签(空格分隔): Java 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 结合题集题目7 ...

  4. 敏捷冲刺DAY6

    一. 每日会议 1. 照片 2. 昨日完成工作 3. 今日完成工作 4. 工作中遇到的困难 对于可视控件,是能进行设计的,但是对于不可视组件,比如AdoConnection怎么才能设计.但是我看del ...

  5. JSON和Django内置序列化

    JSON 什么是JSON JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言 * J ...

  6. 转--- 秒杀多线程第六篇 经典线程同步 事件Event

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...

  7. BZOJ5072 小A的树(树形dp)

    容易猜到能选择的黑点个数是一个连续区间.那么设f[i][j]为i子树内选j个点形成包含根的连通块,最多有几个黑点,g[i][j]为最少有几个黑点,暴力dp是O(n2)的,求出每个连通块大小对应的黑点数 ...

  8. 【移动支付】.NET微信扫码支付接入(模式二-NATIVE)

    一.前言       经过两三天的琢磨总算完成了微信扫码支付功能,不得不感叹几句: 微信提供的DEMO不错,直接复制粘贴就可以跑起来了: 微信的配置平台我真是服了.公众平台.商户平台.开放平台,一个平 ...

  9. 常州day2

    Task1 为了测试小 W 的数学水平,果果给了小 W N 个点,问他这 N 个点能构成的三角形个数. 对于 100%的数据:N<=100,保证任意两点不重合,坐标<=10000 恶心题( ...

  10. 洛谷P4608 [FJOI2016]所有公共子序列问题 【序列自动机 + dp + 高精】

    题目链接 洛谷P4608 题解 建个序列自动机后 第一问暴搜 第二问dp + 高精 设\(f[i][j]\)为两个序列自动机分别走到\(i\)和\(j\)节点的方案数,答案就是\(f[0][0]\) ...