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


这个题出做$DIV2$的$C$以及$DIV1$的A会不会难了一点啊...

做法和题解并不一样,只是很懂题解中记忆化搜索的时候怎么判断的$LOOP$

我们都知道组合游戏中一个状态所有的后继如果都是赢的那么这个状态是输的,一个状态只要有一个后继是输的那么这个状态就是赢的。

但是这个题目中有$LOOP$的情况,考虑将一个点拆为两个,分别表示第一个人和第二个人在这个点是必胜还是必败(也就是答案),如果判断不出来就是$LOOP$

因为$LOOP$不好处理,所以考虑不是记忆化$DFS$,而是按照反向边逆向递推,这个递推过程满足拓扑序就可以了。


  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<vector>
  5 #include<cstdlib>
  6 #include<cmath>
  7 #include<cstring>
  8 #include<queue>
  9 using namespace std;
 10 #define maxn 7010
 11 #define llg long long
 12 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
 13 llg n,m,ans[2][maxn],N1,N2,a[maxn],b[maxn],se[2][maxn],du[2][maxn];
 14
 15 struct node
 16 {
 17     llg v1,v2;
 18 }f[2][maxn];
 19
 20 struct data
 21 {
 22     llg x,y;
 23 };
 24
 25 queue<data>dl;
 26
 27 inline int getint()
 28 {
 29     int w=0,q=0; char c=getchar();
 30     while((c<'0' || c>'9') && c!='-') c=getchar(); if(c=='-') q=1,c=getchar();
 31     while (c>='0' && c<='9') w=w*10+c-'0', c=getchar(); return q ? -w : w;
 32 }
 33 void work()
 34 {
 35     ans[0][1]=ans[1][1]=2;
 36     data w;
 37     w.x=0,w.y=1;
 38     dl.push(w); w.x=1;
 39     dl.push(w);
 40     while (!dl.empty())
 41     {
 42         w=dl.front(); dl.pop();
 43         llg x=w.x,y=w.y;
 44         if (!x)
 45         {
 46             for (llg i=1;i<=N2;i++)
 47             {
 48                 llg wz=(y-b[i]+n-1)%n+1;
 49                 du[1][wz]--;
 50                 if (ans[1][wz]) continue;
 51                 if (ans[x][y]==2)
 52                 {
 53                     ans[1][wz]=1;
 54                     data nw; nw.x=1,nw.y=wz;
 55                     dl.push(nw);
 56                     du[1][wz]=-1;
 57                 }
 58                 if (du[1][wz]==0)
 59                 {
 60                     ans[1][wz]=2;
 61                     data nw; nw.x=1,nw.y=wz;
 62                     dl.push(nw);
 63                     du[1][wz]=-1;
 64                 }
 65             }
 66         }
 67         else
 68         {
 69             for (llg i=1;i<=N1;i++)
 70             {
 71                 llg wz=(y-a[i]+n-1)%n+1;
 72                 du[0][wz]--;
 73                 if (ans[0][wz]) continue;
 74                 if (ans[x][y]==2)
 75                 {
 76                     ans[0][wz]=1;
 77                     data nw; nw.x=0,nw.y=wz;
 78                     dl.push(nw);
 79                     du[0][wz]=-1;
 80                 }
 81                 if (du[0][wz]==0)
 82                 {
 83                     ans[0][wz]=2;
 84                     data nw; nw.x=0,nw.y=wz;
 85                     dl.push(nw);
 86                     du[0][wz]=-1;
 87                 }
 88             }
 89         }
 90     }
 91 }
 92
 93 int main()
 94 {
 95     yyj("C");
 96     cin>>n;
 97     cin>>N1;
 98     for (llg i=1;i<=N1;i++) a[i]=getint();
 99     cin>>N2;
100     for (llg i=1;i<=N2;i++) b[i]=getint();
101
102     for (llg i=1;i<=n;i++)
103     {
104         du[0][i]=N1,du[1][i]=N2;
105     }
106
107     work();
108     for (llg i=2;i<=n;i++)
109     {
110         if (ans[0][i]==1) printf("Win ");
111         if (ans[0][i]==2) printf("Lose ");
112         if (ans[0][i]==0) printf("Loop ");
113     }
114     printf("\n");
115     for (llg i=2;i<=n;i++)
116     {
117         if (ans[1][i]==1) printf("Win ");
118         if (ans[1][i]==2) printf("Lose ");
119         if (ans[1][i]==0) printf("Loop ");
120     }
121     return 0;
122 }

转载于:https://www.cnblogs.com/Dragon-Light/p/6609684.html

Codeforces 786 A. Berzerk相关推荐

  1. 【codeforces 787C】Berzerk

    [题目链接]:http://codeforces.com/contest/787/problem/C [题意] 给你怪物一开始所在的位置; 然后两人轮流操作; 可以选择让这个怪物前进自己的集合里面所拥 ...

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

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

  3. Codeforces 786A Berzerk(博弈论)

    [题目链接] http://codeforces.com/problemset/problem/786/A [题目大意] 有两个人,每个人有一个数集,里面有一些数,现在有一个环,有个棋子放在1, 有个 ...

  4. Berzerk CodeForces - 787C (BFS)题解

    Codeforces Round #406 (Div. 2)-- A - Berzerk A. Berzerk time limit per test4 seconds memory limit pe ...

  5. CodeForces 786A Berzerk 博弈?BFS瞎搞

    ans[i][j] i号选手在位置j行动的结果. 预处理,将每位选手能够直接到达黑洞的点 ans[1][(n-a[1][i]+n) % n] = -1; 表示必赢的点 把这些点加入到队列,作为BFS的 ...

  6. Codeforces 786A Berzerk(博弈)

    题目链接 很明显的博弈题目,但是昨天打比赛的时候就是一直想不出来,一直在纠结这个loop的情况到底要怎么定义,感觉到深深的挫败感,自己之前专门看了一段时间博弈也没有任何用处= =太菜了 今天看了一下题 ...

  7. Codeforces Round #406 (Div. 1) A. Berzerk(博弈论)

    能转移到必败态的状态就是必胜态,只能转移到必胜态的状态就是必败态.反过来看,假设win[0][1]=win[1][1]=0,若当前为v,位置为now:(1)若win[v][now]=0,则win[v^ ...

  8. Codeforces Round #786 (Div. 3) Editorial(A/B/C/D)待补

    A. int main() {IOS;// freopen("P1908_6.in","r",stdin);//读入数据// freopen("P19 ...

  9. Codeforces Round #786 (Div. 3) G. Remove Directed Edges——树形dp+记忆化

    思路参考 题目链接 思路 题目要求删除一些边,要让最后每个点的入度,出度都小于最开始的情况,或者等于0. 那么出度为1或者入度为1的边一定会被删掉,而且题目说明不存在重边和环,最后的结果一定是一条链. ...

最新文章

  1. 那些在一个公司死磕5-10年的人,最后都怎么样了...
  2. 031_jQuery Ajax的post方法
  3. 解读“中国数字人民币的研发进展白皮书“
  4. 帮设计师与工程师更好沟通的实用技巧
  5. React Native官方DEMO
  6. (转)使用Spring配置文件实现AOP
  7. mybatis审查要点
  8. 【iCore3应用】基于iCore3双核心板的编码器应用实例
  9. 开源,免费,跨平台——白鹭引擎(Egret Engine)
  10. 综合支撑【恶灵附身 Psycho Break】的世界观的概念艺术
  11. wps2016向程序发送命令_解决excel弹出“向程序发送命令时出现问题”的方法
  12. 巨人史玉柱的创业故事
  13. Linux启动阶段Grub损坏修复
  14. PTA 校选拔 7-10 宇航员的寻宝图(BFS)
  15. 单片机音乐盒c语言源程序,51单片机八音盒源程序(汇编语言)
  16. ROX-Filer 2.6
  17. vi复制粘贴(转贴+自己总结)
  18. Java中实现图片的上传
  19. Vue中的插件小练习
  20. Redies应用计数

热门文章

  1. Java小项目——家庭记账项目
  2. html中根据屏幕大小变化的单位,根据浏览器窗口大小的自适应 单位
  3. Oracle那些年那些事儿
  4. 2020年最新一二三线互联网公司出炉,附校招和社招薪资行情
  5. saber软件安装后怎么打开_关于 saber 仿真软件基本应用和案例的详细过程解析(上)...
  6. EPON OLT光模块RSSI问题分析报告
  7. miui 7 android,小米MIUI 7仍然使用Android 4.4内核,米粉炸了
  8. 淘宝商品比价定向爬虫-Python网络爬虫与信息提取-北京理工大学嵩天教授
  9. rsa public key not find与Generate First a serial的解决方案-6.13日摸索总结
  10. Springboot项目使用Idea直接生成docker镜像部署到Centos7.6