有向图博弈+出度的结合 Codeforces Round #406 (Div. 2) C
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的更多相关文章
- 【动态规划】Codeforces Round #406 (Div. 2) C.Berzerk
有向图博弈问题. 能转移到一个必败态的就是必胜态. 能转移到的全是必胜态的就是必败态. 转移的时候可以用队列维护. 可以看这个 http://www.cnblogs.com/quintessence/ ...
- Codeforces #Round 406(Div.2)
来自FallDream的博客,未经允许,请勿转载,谢谢. ------------------------------------------------------- 大家好,我是一个假人.在学习O ...
- Codeforces Round #406 (Div. 1) B. Legacy 线段树建图跑最短路
B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...
- Codeforces Round #406 (Div. 1) A. Berzerk 记忆化搜索
A. Berzerk 题目连接: http://codeforces.com/contest/786/problem/A Description Rick and Morty are playing ...
- Codeforces Round #406 (Div. 2)滚粗记
A 一看到题,不是一道解不定方程的裸题吗,调了好久exgcd. 其实一个for就好了啊 B 一直WA ON TEST 7真是烦,一想会不会是编号太大了,又写了一个map版本,无用. 调了好久好久才发现 ...
- 维护前面的position+主席树 Codeforces Round #406 (Div. 2) E
http://codeforces.com/contest/787/problem/E 题目大意:给你n块,每个块都有一个颜色,定义一个k,表示在区间[l,r]中最多有k中不同的颜色.另k=1,2,3 ...
- 区间->点,点->区间,线段树优化建图+dijstra Codeforces Round #406 (Div. 2) D
http://codeforces.com/contest/787/problem/D 题目大意:有n个点,三种有向边,这三种有向边一共加在一起有m个,然后起点是s,问,从s到所有点的最短路是多少? ...
- 【转】Codeforces Round #406 (Div. 1) B. Legacy 线段树建图&&最短路
B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...
- Codeforces Round #406 (Div. 1)
B题打错调了半天,C题想出来来不及打,还好没有挂题 AC:AB Rank:96 Rating:2125+66->2191 A.Berzerk 题目大意:有一个东东在长度为n的环上(环上点编号0~ ...
随机推荐
- Beta阶段第三次网络会议
Beta阶段第三次网络会议 第二次会议问题解决情况 不同等级城堡不同图片,移动动画解决,阴影效果添加 小地图信息添加城堡和士兵信息 新AI设计失败,在存在科技树的情况下,如果将所有可能操作全部纳入考虑 ...
- tensorboard入门
Tensorboard tensorboard用以图形化展示我们的代码结构和图形化训练误差等,辅助优化程序 tensorboard实际上是tensorflow机器学习框架下的一个工具,需要先安装ten ...
- J2EE,J2SE,J2ME,JDK,SDK,JRE,JVM区别(转载)
转载地址:http://blog.csdn.net/alspwx/article/details/20799017 一.J2EE.J2SE.J2ME区别 J2EE——全称Java 2 Enterpri ...
- lintcode-391-数飞机
391-数飞机 给出飞机的起飞和降落时间的列表,用 interval 序列表示. 请计算出天上同时最多有多少架飞机? 注意事项 如果多架飞机降落和起飞在同一时刻,我们认为降落有优先权. 样例 对于每架 ...
- 配置java环境 启动服务
1:查看当前的Java JDK版本,是否符合要求,下载的为2.4.4版本,因此满足条件 [root@7 ~]# java -version openjdk version "1.8.0_65 ...
- 运维工程师如果将web服务http专变为https
1:生成私钥 2:生成证书签署请求 3:在提供CA签署的web网站上,提交生成的证书签署请求 4:下载已经签署的CA证书 5:将证书的信息保留在web服务器中,且应用到提供web服务的 ...
- selenium webdriver XPath的定位方法练习 !
html 代码: <html> <body> <div id="div1"> <input name="divl1input& ...
- 【vue】index.html main.js app.vue index.js怎么结合的? 怎么打包的?搜集的信息
转载:https://blog.csdn.net/yudiandemingzi/article/details/80247137 怎么结合的: 一.启动项目 第一步:cmd进入项目文件里,运行npm ...
- 解决Qt creator无法输入中文
详细的方法来自以下网址: http://my.oschina.net/lieefu/blog/505363?p={{currentPage+1}} 需要说明的几点: 设置qmake 的路径使用自身的路 ...
- QT学习记录
QApplication app(argc,argv); 创建了一个QApplication对象,这个对象用于管理应用程序级别的资源.QApplication的构造函数要求两个参数,分别来自main的 ...