[POI2001]Gra绿色游戏
Description
绿色游戏是一种两人游戏,双方分别称Ann和Billy。游戏的内容主要是轮流在棋盘上移动一颗棋子。棋盘上的点一部分是绿色的,其余是白色的;全部从1至a+b编号。编号1至a的点属于Ann,编号(a+1)至(a+b)的点属于Billy。每个点都有一些后继点,均可一步到达。属于Ann的点的后继点一定属于Billy,反之亦然。所有的点都至少有一个后继点,这样总可以往下走一步。游戏开始时把棋子放在任意的一点P上,然后双方轮流移动棋子至当前所在点(属于移动方)的一个后继点上(属于对手)。游戏由点P的拥有者开始,结束时棋子第二次到达了某一点,称点Q。如果在从点Q至点Q的一连串移动中,棋子至少一次被放到绿色点上,则Ann赢。若从点P开始,不管Billy如何移动,Ann总能保证赢得这次游戏,则称Ann对起始点P有必胜的策略。
任务: 算出Ann有必胜策略的起始点;
Input
首行有两个整数a和b,两个整数之间用一个空格分开,分别表示属于Ann和Billy的点数(1小于等于a,b小于等于3000)。
以下a+b行是对各点的描述,先描述Ann的点,再描述Billy的点。
第i+1行(1小于等于i小于等于a+b)以整数z,k开始:z表示点i的颜色(O-白色,I-绿色),k表示后继点的数目。
然后是K个整数(1小于等于k<a+b),写在同一行,代表点i后继点的编号,这些整数均用一个空格分开。
绿点的个数不超过100,所有点的后继点的个数之和不超过30000。
Output
首行仅一个整数L,代表Ann有L个有必胜策略的起始点。以下L行按升序顺序依次给出这些点的编号。
Sample Input
5 3
0 2 6 7
0 3 6 7 8
0 1 8
1 1 7
1 1 8
1 2 1 2
0 2 1 2
0 2 3 4
Sample Output
5
1
2
4
6
7
维护一个保护集合\(S\),表示哪些点\(A\)可能胜利。
首先将所有绿点加入\(S\)。
\(1.\)对于一个不在\(S\)的\(A\)点,若它存在某个后继在\(S\)中,则将其加入\(S\)。
\(2.\)对于一个不在\(S\)的\(B\)点,若它所有后继都在\(S\)中,则将其加入\(S\)。
通过拓扑可以\(O(n+m)\)求出\(S\)集合,那么剩下的点\(A\)必败。
\(1.\)对于一个在\(S\)的\(A\)点,若它所有后继都不在\(S\)中,则将其从\(S\)中移除。
\(2.\)对于一个在\(S\)的\(B\)点,若它存在某个后继不在\(S\)中,则将其从\(S\)中移除。
同样可以通过拓扑\(O(n+m)\)求出最终的\(S\)集合。
这样会导致某些绿点不在\(S\)中,那么它们就失去了作为绿点的价值,将其标记为白点。
重复运行这个算法\(O(n)\)轮直到所有绿点都发挥了价值,此时\(S\)中的点\(A\)必胜。
时间复杂度\(O(n(n+m))\)。
/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
int x=0,f=1;char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
return x*f;
}
inline void print(int x){
if (x>=10) print(x/10);
putchar(x%10+'0');
}
const int N=3e3,M=3e4;
int pre[M+10],now[N+10],child[M+10],d[N+10],deg[N+10],h[N+10],Ans[N+10];
bool vis[N+10],c[N+10];
int n,m,tot;
void join(int x,int y){pre[++tot]=now[x],now[x]=tot,d[child[tot]=y]++;}
bool solve(){
int head=1,tail=0;
for (int i=1;i<=n;i++){
vis[i]=c[i],deg[i]=d[i];
vis[i]?h[++tail]=i:0;
}
for (;head<=tail;head++){
int Now=h[head];
for (int p=now[Now],son=child[p];p;p=pre[p],son=child[p]){
if (vis[son]) continue;
son<=m?vis[h[++tail]=son]=1:!--deg[son]?vis[h[++tail]=son]=1:0;
}
}
head=1,tail=0;
for (int i=1;i<=n;i++){
deg[i]=d[i];
!vis[i]?h[++tail]=i:0;
}
for (;head<=tail;head++){
int Now=h[head];
for (int p=now[Now],son=child[p];p;p=pre[p],son=child[p]){
if (!vis[son]) continue;
son>m?vis[h[++tail]=son]=0:!--deg[son]?vis[h[++tail]=son]=0:0;
}
}
bool flag=0;
for (int i=1;i<=n;i++) if (c[i]&&!vis[i]) c[i]=0,flag=1;
return flag;
}
int main(){
m=read(),n=read()+m;
for (int i=1,k;i<=n;i++){
c[i]=read(),k=read();
for (int j=1;j<=k;j++) join(read(),i);
}
while (solve());
int cnt=0;
for (int i=1;i<=n;i++) if (vis[i]) Ans[++cnt]=i;
printf("%d\n",cnt);
for (int i=1;i<=cnt;i++) printf("%d\n",Ans[i]);
return 0;
}
[POI2001]Gra绿色游戏的更多相关文章
- BZOJ2948 : [Poi2001]绿色游戏
维护一个保护集合$S$,表示哪些点$A$可能胜利. 首先将所有绿点加入$S$. $1.$对于一个不在$S$的$A$点,若它存在某个后继在$S$中,则将其加入$S$. $2.$对于一个不在$S$的$B$ ...
- 游戏行业DDoS攻击解决方案
行业综述 根据全球游戏和全球移动互联网行业第三方分析机构Newzoo的数据显示:2017年上半年,中国以275亿美元的游戏市场收入超过美国和日本,成为全球榜首. 游戏行业的快速发展.高额的攻击利润.日 ...
- 阿里云:游戏行业DDoS攻击解决方案
转自:http://www.gamelook.com.cn/2018/01/319420 根据全球游戏和全球移动互联网行业第三方分析机构Newzoo的数据显示:2017年上半年,中国以275亿美元的游 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 病毒木马查杀实战第013篇:一个基于.NET的“敲竹杠”病毒研究
前言 恶意程序发展至今,其功能已经从最初的单纯破坏,不断发展为隐私的窥探,信息的盗取,乃至如今非常流行的"敲竹杠"病毒,用于勒索.可见随着时代的发展,病毒的作者们往往也是想利用自己 ...
- MMORPG大型游戏设计与开发(攻击区域 扇形)
距离上次发布已经有了很长一段时间,期间由于各种原因没有更新这方面的技术分享,在这里深表遗憾.在MMO或其他的游戏中,会有针对各种形状的计算,通常在攻击区域里不会很复杂,常见的为矩形.圆形.扇形.今天分 ...
- 网页闯关游戏(riddle webgame)--H5刮刮卡的原理和实践
前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 对于刮刮卡, 想必大家都很熟悉, 也很喜 ...
- Unity关于获取游戏对象
我觉得Unity里面的Transform 和 GameObject就像两个双胞胎兄弟一样,这俩哥们很要好,我能直接找到你,你也能直接找到我.我看很多人喜欢在类里面去保存GameObject对象.解决G ...
- 转载:[转]如何学好3D游戏引擎编程
[转]如何学好3D游戏引擎编程 Albert 本帖被 gamengines 从 游戏引擎(Game Engine) 此文为转载,但是值得一看. 此篇文章献给那些为了游戏编程不怕困难的热血青年,它的 ...
随机推荐
- sql 语句哪里添加单引号问题
1.sql 语句哪里添加单引号问题,哪些地方必须加双引号,否则sql语句会报错? :涉及varchar的值的时候,必须有单引号包括varchar值.int等其他字段类型,则不需要加单引号包括. 如: ...
- 《gis空间分析及应用案例解析》培训总结
<gis空间分析及应用案例解析>培训总结 来源:常德水情 作者:唐校准 发布日期:2014-01-02 2013年12月2630日由中国科学院计算技术研究所教育中心组织的< ...
- C语言取整方法总结
C语言有下面几种取整方法: 1. 直接赋值给整数变量 int i = 3.5; 或 i = (int) 3.5; 这样的方法採用的是舍去小数部分. 2.整数除法运算符' / '取整 ' / ...
- 解决java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException
解决: 工程目录.settings\org.eclipse.wst.common.project.facet.core.xml文件中jst.web的version降低到2.5 <?xml ver ...
- 【OpenGL】Shader实例分析(七)- 雪花飘落效果
转发请保持地址:http://blog.csdn.net/stalendp/article/details/40624603 研究了一个雪花飘落效果.感觉挺不错的.分享给大家,效果例如以下: 代码例如 ...
- IEnumerator<TItem>和IEnumerator Java 抽象类和普通类、接口的区别——看完你就顿悟了
IEnumerable 其原型至少可以说有15年历史,或者更长,它是通过 IEnumerator 来定义的,而后者中使用装箱的 object 方式来定义,也就是弱类型的.弱类型不但会有性能问题,最主要 ...
- 释怀我的诺亚尔 不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco)
释怀我的诺亚尔 不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco) 最近,需要搭建一个新项目,在需求分析时确定数据库中需要创建多个存储过程.所以如果还是用原来E ...
- ASO--简单了解
ASO是“应用商店优化”的简称.ASO(App Search Optimization)就是提升你APP在各类APP应用商店/市场排行榜和搜索结果排名的过程. 类似普通网站针对搜索引擎的优化,即SEO ...
- [转] 买彩票的利器--gun
源链接 还在自己买彩票吗,有个现成的:GNU shuf命令. shuf -i - -n | 这样就会产生两组彩票(1~36个数字任选) 当然还可以派其他用途,比如: shuf -e clubs hea ...
- Redis管理各类型存储数据命令
>>>字符串 1 SET key value 设置指定 key 的值 2 GET key 获取指定 key 的值. 3 GETRANGE key start end 返回 key 中 ...