Codeforces 786A Berzerk(博弈论)
【题目链接】 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(博弈论)的更多相关文章
- [刷题]Codeforces 786A - Berzerk
http://codeforces.com/problemset/problem/786/A Description Rick and Morty are playing their own vers ...
- cf786a
title: CodeForces 786A Berzerk data: 2018-3-3 10:29:40 tags: 博弈论 bfs 无限 with draw copyright: true ca ...
- ACM 博弈(难)题练习 (第一弹)
第二弹: 套路&&经验总结: 1. N堆***的游戏,一般可以打表找SG函数的规律.比如CodeForces 603C 2.看起来是单轮的游戏,实际上可能拆分成一些独立的子游戏.比如C ...
- Codeforces Round #406 (Div. 1) A. Berzerk 记忆化搜索
A. Berzerk 题目连接: http://codeforces.com/contest/786/problem/A Description Rick and Morty are playing ...
- [Codeforces 1191D] Tokitsukaze, CSL and Stone Game(博弈论)
[Codeforces 1191D] Tokitsukaze, CSL and Stone Game(博弈论) 题面 有n堆石子,两个人轮流取石子,一次只能从某堆里取一颗.如果某个人取的时候已经没有石 ...
- codeforces 1451D,一道有趣的博弈论问题
大家好,欢迎来到codeforces专题. 今天选择的问题是Contest 1451场的D题,这是一道有趣简单的伪博弈论问题,全场通过的人有3203人.难度不太高,依旧以思维为主,坑不多,非常友好. ...
- Codeforces 1411G - No Game No Life(博弈论+生成函数+FWTxor)
Codeforces 题面传送门 & 洛谷题面传送门 一道肥肠套路的题目. 首先这题涉及博弈论.注意到这里每一个棋子的移动方式都是独立的,因此可以考虑 SG 定理.具体来说,我们先求出每个棋子 ...
- Codeforces 1458E - Nim Shortcuts(博弈论+BIT)
Codeforces 题目传送门 & 洛谷题目传送门 首先看到这样的题我们不妨从最特殊的情况入手,再逐渐推广到一般的情况.考虑如果没有特殊点的情况,我们将每个可能的局面看作一个点 \((a,b ...
- 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 ...
随机推荐
- 免费的dns服务器(更换dns服务器有时可以解决某些网站(如爱奇艺访问不了的问题))
首先百度提供的dns就是非常好用的dns,小编就把百度的dns作为首选180.76.76.76. 其次是阿里提供的dns223.5.5.5,响应速度非常的快,而且没有广告劫持. 再就是最通用的 ...
- 转:Spring AOP详解
转:Spring AOP详解 一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址: ...
- 关于ora-12154:TNS:could not resolve the connect identifier specified
一:前言 刚刚出来实习,在公司配的电脑里面装的oracle和PL SQL时一次性就搞定,但是在自己的电脑上装了就出现这个问题,刚刚在网上看了下,所以自己就写份记载吧! 二: 在打开PLSQL Deve ...
- ssh中的相对路径与绝对路径的问题
一:前言:自己在学习ssh的时候常常被路径给迷惑,就比如在刚刚学习jsp的servlet时,绝对路径和相对路径我就弄混了,所以专门写了一篇博客来记载.而现在自己是在学ssh的时候在此遇到路径问题,本来 ...
- HDU5748---(记录每个元素的 最长上升子序列 nlogn)
分析: 给一个序列,求出每个位置结尾的最长上升子序列 O(n^2) 超时 #include "cstdio" #include "algorithm" #def ...
- Web.xml过滤器配置及执行顺序概念
第一个过滤器 @Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain ch ...
- Linux提权思路
先写个大概 0. dirtycow 不同的dirtycow有不同执行条件. 使用前先对照此表根据内核版本确认是否已经修复 https://github.com/dirtycow/dirtycow.gi ...
- 出现“error c4430缺少类型说明符-假定为int。注意C++不支持默认int
出现这种错误的原因,是因为函数没有写返回值.是在VC6.0的工程转为高版本(VS2010)的时候经常出现的; #include <stdio.h> main() { printf(&quo ...
- 1.docker镜像
1.docker的安装 安装 wget -qO- https://get.docker.com/ | sh 启动docker后台服务 sudo service docker start 测试运行hel ...
- OpenCV 3.0中IplImage* 转cv::Mat
在OpenCV 2.0中使用: IplImage * ipl1, *ipl2; // ... const cv::Mat m = cv::Mat(ipl,false); cv::Mat m2 = ip ...