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


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

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

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

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

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


 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
#define maxn 7010
#define llg long long
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m,ans[][maxn],N1,N2,a[maxn],b[maxn],se[][maxn],du[][maxn]; struct node
{
llg v1,v2;
}f[][maxn]; struct data
{
llg x,y;
}; queue<data>dl; inline int getint()
{
int w=,q=; char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar(); if(c=='-') q=,c=getchar();
while (c>='' && c<='') w=w*+c-'', c=getchar(); return q ? -w : w;
}
void work()
{
ans[][]=ans[][]=;
data w;
w.x=,w.y=;
dl.push(w); w.x=;
dl.push(w);
while (!dl.empty())
{
w=dl.front(); dl.pop();
llg x=w.x,y=w.y;
if (!x)
{
for (llg i=;i<=N2;i++)
{
llg wz=(y-b[i]+n-)%n+;
du[][wz]--;
if (ans[][wz]) continue;
if (ans[x][y]==)
{
ans[][wz]=;
data nw; nw.x=,nw.y=wz;
dl.push(nw);
du[][wz]=-;
}
if (du[][wz]==)
{
ans[][wz]=;
data nw; nw.x=,nw.y=wz;
dl.push(nw);
du[][wz]=-;
}
}
}
else
{
for (llg i=;i<=N1;i++)
{
llg wz=(y-a[i]+n-)%n+;
du[][wz]--;
if (ans[][wz]) continue;
if (ans[x][y]==)
{
ans[][wz]=;
data nw; nw.x=,nw.y=wz;
dl.push(nw);
du[][wz]=-;
}
if (du[][wz]==)
{
ans[][wz]=;
data nw; nw.x=,nw.y=wz;
dl.push(nw);
du[][wz]=-;
}
}
}
}
} int main()
{
yyj("C");
cin>>n;
cin>>N1;
for (llg i=;i<=N1;i++) a[i]=getint();
cin>>N2;
for (llg i=;i<=N2;i++) b[i]=getint(); for (llg i=;i<=n;i++)
{
du[][i]=N1,du[][i]=N2;
} work();
for (llg i=;i<=n;i++)
{
if (ans[][i]==) printf("Win ");
if (ans[][i]==) printf("Lose ");
if (ans[][i]==) printf("Loop ");
}
printf("\n");
for (llg i=;i<=n;i++)
{
if (ans[][i]==) printf("Win ");
if (ans[][i]==) printf("Lose ");
if (ans[][i]==) printf("Loop ");
}
return ;
}

最新文章

  1. 连载 [ LTS + Top ]
  2. 开源网站.NETMVC+ Layui+SqlSugar+RestSharp
  3. flex 图片旋转(解决公转和自转问题)
  4. Web API 依赖注入与扩展
  5. iOS 8创建交互式通知
  6. Hadoop build error java.lang.NoClassDefFoundError: org/sonatype/aether/graph/DependencyFilter
  7. JavaScript之apply()和call()的区别
  8. 学习笔记——门面模式Facade
  9. 决策树(ID3 )原理及实现
  10. 恶意软件Mirai换了个马甲 瞄上我国2亿多台IoT设备
  11. 11个超棒的iOS开发学习网站
  12. BZOJ_2001_[BeiJing2006]狼抓兔子_最小割转对偶图
  13. jquery获取元素节点
  14. Windows Server 2016-配置Windows Defender防病毒排除项
  15. 【转】python模块分析之hashlib加密(二)
  16. indexOf 引用
  17. 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-7底层驱动之滴嗒定时器
  18. WebShell代码分析溯源(第1题)墨者学院
  19. mothur summary.seqs 统计fasta文件中每条序列的长度
  20. 微软职位内部推荐-Software Engineer II_VS

热门文章

  1. 自制TFT-Usart通信小项目资料打包
  2. Matlab基础部分1
  3. zabbix agent配置详解(windows)
  4. mysql01
  5. Prometheus监控学习笔记之全面学习Prometheus
  6. php 获取网站根目录
  7. Navicat使用ssh连接数据库
  8. Eclipse中ctrl+shift+r与ctrl+shift+t的区别
  9. 20155201 网络攻防技术 实验五 MSF基础应用
  10. [内核驱动] miniFilter 内核层与应用程序通信