题目大意

现在有两个人在一个n个结点的有向图上玩一个双人游戏,保证图中无环和自圈。游戏的规则如下:
1.初始的时候$i$号点有一个正权值$value_i$
2.两名玩家依次操作,每个玩家在当前回合可以选择一个具有如下性质的点
-该点的权值为正
-该点具有至少一条出边
如果不存在这样子的点,那么当前回合的玩家输掉整局游戏
3.当某名玩家选定一个点以后,将该点的$value$减一,并将$K_i$个该点出边连向的点的$value$加一,这$K_i$个点由当前玩家选择,并允许选择重复的点。
现在给出整个有向图和$K_i$,每次询问给定每个点的$value$,判断先手玩家是否存在必胜策略。

$n\leq 100$,每个点的出边数量不超过$17$。

题解

由于每一步操作只令$value_i$的值$-1$,所以可以把“在$x$点有$1$的权值”看做“以$x$点为起点开始一局游戏”。

考虑在$x$点做两局游戏一定是后手赢,因为不论执先手的人在某一局子游戏进行操作,后手只需要在另一局进行对称操作即可。

所以只关心$value$的奇偶性。

由于每一个点的出边不超过$17$,所以以一个点为起点的子游戏,其后继是可枚举的。

具体的,对于没有出边的点$x,Sg_x=0$。

否则枚举每一条出边是否改变出边指向的点$y$的游戏的次数的奇偶性,将游戏次数奇偶性被改变的后继的点集记为$S$,设这$S$个点的$Sg$值的异或和为$F_S$,则$$Sg_x=mex\{F_S\}(|S|\leq K_i,|S|\equiv K_i\mod x)$$

即枚举每一个$x$点出发能到达的所有后继状态,每一个后继状态都有若干个子游戏组成,其根据$Sg$定理,$Sg$值为每一个子游戏的$Sg$值异或和,所以对所有个后继状态$Sg$值求$mex$即可。

对于每一次询问,对于所有的$x$满足以$x$点进行了奇数次游戏,则将这些$Sg_x$异或起来和,若为$0$则先手必败,负责先手必胜。

复杂度为$O(T(2^{17}n+Qn))$

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<cmath>
  6. #define LL long long
  7. #define M 200
  8. #define N 540000
  9. using namespace std;
  10. int read(){
  11. int nm=0,fh=1; int cw=getchar();
  12. for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh;
  13. for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0');
  14. return nm*fh;
  15. }
  16. int n,m,sz[M],to[M][20],tmp,K[M],val,sg[M],bt[N],G[N],F[N];
  17. void link(int x,int y){to[x][++sz[x]]=y;} bool vs[N];
  18. void DP(int x){
  19. if(sg[x]!=-1) return; if(!sz[x]){sg[x]=0;return;}
  20. for(int i=1;i<=sz[x];i++) DP(to[x][i]);
  21. for(int i=1;i<=sz[x];i++) G[1<<(i-1)]=sg[to[x][i]];
  22. int MAXN=(1<<sz[x]); F[0]=sg[x]=0;
  23. for(int i=1;i<MAXN;i++) F[i]=(F[i^(i&(-i))]^G[i&(-i)]);
  24. for(int i=0;i<MAXN;i++) if(bt[i]<=K[x]&&!((K[x]^bt[i])&1)) vs[F[i]]=true;
  25. while(vs[sg[x]]) ++sg[x]; for(int i=0;i<MAXN;i++) vs[F[i]]=false;
  26. }
  27. int main(){
  28. for(int i=1;i<(1<<19);i++) bt[i]=bt[i>>1]+(i&1);
  29. memset(vs,false,sizeof(vs));
  30. for(int Qs=read(),nq=1;nq<=Qs;nq++,putchar('\n')){
  31. printf("Game#%d:\n",nq),memset(sg,-1,sizeof(sg));
  32. n=read(),m=read(),memset(sz,0,sizeof(sz));
  33. for(int i=1;i<=m;i++){int x=read(),y=read();link(x+1,y+1);}
  34. for(int i=1;i<=n;i++) K[i]=read();
  35. for(int i=1;i<=n;i++) DP(i);
  36. for(int rm=1,rs=0,Qr=read();rm<=Qr;rm++,rs=0){
  37. for(int i=1;i<=n;i++) val=read(),rs^=((val&1)*sg[i]);
  38. printf("Round#%d: ",rm),puts(rs?"WINNING":"LOSING");
  39. }
  40. }
  41. return 0;
  42. }

UVA12163 游戏的更多相关文章

  1. 使用HTML5开发Kinect体感游戏

    一.简介 我们要做的是怎样一款游戏? 在前不久成都TGC2016展会上,我们开发了一款<火影忍者手游>的体感游戏,主要模拟手游章节<九尾袭来 >,用户化身四代,与九尾进行对决, ...

  2. jQuery实践-网页版2048小游戏

    ▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...

  3. Unity游戏内版本更新

    最近研究了一下游戏内apk包更新的方法. ios对于应用的管理比较严格,除非热更新脚本,不太可能做到端内大版本包的更新.然而安卓端则没有此限制.因此可以做到不跳到网页或应用商店,就覆盖更新apk包. ...

  4. 游戏服务器菜鸟之C#初探一游戏服务

    本人80后程序猿一枚,原来搞过C++/Java/C#,因为工作原因最后选择一直从事C#开发,因为读书时候对游戏一直比较感兴趣,机缘巧合公司做一个手游的项目,我就开始游戏服务器的折腾之旅. 游戏的构架是 ...

  5. iOS审核这些坑,腾讯游戏也踩过

    作者:Jamie,专项技术测试工程师,在iOS预审和ASO优化领域从事专项测试相关工作,为腾讯游戏近100个产品提供专项服务. WeTest 导读 在App上架苹果应用商店的过程中,相信大多数iOS开 ...

  6. 漫谈C#编程语言在游戏领域的应用

    0x00 前言 随着微软越来越开放,C#也变得越来越吸引人们的眼球.而在游戏行业中,C#也开始慢慢地获得了关注.这不, 网易绝代双娇手游团队已经全面使用.Net Core支持前后端统一C#开发,跨平台 ...

  7. 解构C#游戏框架uFrame兼谈游戏架构设计

    1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它 ...

  8. 趣说游戏AI开发:曼哈顿街角的A*算法

    0x00 前言 请叫我标题党!请叫我标题党!请叫我标题党!因为下面的文字既不发生在美国曼哈顿,也不是一个讲述美国梦的故事.相反,这可能只是一篇没有那么枯燥的关于算法的文章.A星算法,这个在游戏寻路开发 ...

  9. 拼图小游戏之计算后样式与CSS动画的冲突

    先说结论: 前几天写了几个非常简单的移动端小游戏,其中一个拼图游戏让我郁闷了一段时间.因为要获取每张图片的位置,用`<style>`标签写的样式,直接获取计算后样式再用来交换位置,结果就悲 ...

随机推荐

  1. mysql慢查询日志分析工具(python写的)

    D:\NormalSoftware>python mysql_filter_slow_log.py ./mysql1-slow.log --no-duplicates --sort-avg-qu ...

  2. CSS中设置div垂直居中

    在说到这个问题的时候,也许有人会问CSS中不是有vertical-align属性来设置垂直居中的吗?即使是某些浏览器不支持我只需做少许的CSS Hack技术就可以啊!所以在这里我还要啰嗦两句,CSS中 ...

  3. nginx的location

    nginx的location分为普通location和正则location. 在普通location中,匹配规则是最大前缀匹配. 在正则location中,匹配规则是先到先得匹配.(最先匹配的正则lo ...

  4. iOS 开发与H5交互(JavaScriptCore框架的使用)

    现在的iOS项目中嵌入了越来越多的Web界面,当然是为了方便,那么为了迎合这一趋势,作为iOS开发程序员,我们必须要了解怎么样用OC去和这些Web界面进行交互.这里介绍的是JavaScriptCore ...

  5. ASP获取上月本月下月的第一天和最后一天

    上月第一天:<%=dateadd("m",-1,year(date)&"-"&month(date)&"-1" ...

  6. SQL2000 3核6核 CUP 安装SP4

    1.找到HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432node\Microsoft\MSSQLServer \MSSQLServer\Parameters\ 2.然后加入下面的 ...

  7. python基础14 ---函数模块5(模块和包)

    模块与包 一.模块 1.模块是怎么诞生的. 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护.为了编写可维护的代码,我们把很多函数分组,分别放到 不同的文 ...

  8. 《程序员代码面试指南》第三章 二叉树问题 判断t1 树中是否有与t2 树拓扑结构完全相同的子树

    题目 判断t1 树中是否有与t2 树拓扑结构完全相同的子树 java代码 package com.lizhouwei.chapter3; /** * @Description: 判断t1 树中是否有与 ...

  9. 第一篇、javascript变量和循环

    一.代码存放位置 理论上放在body和head中都可以,但是推荐放在body代码块底部,因为Html代码是从上到下执行,如果Head中的js代码耗时严重,就会导致用户长时间无法看到页面,如果放置在bo ...

  10. Spring Cloud之Feigin客户端重构思想

    应该重构接口信息(重点) toov5-parent  存放共同依赖信息 toov5-api       api的只有接口没有实现 toov5-api-member toov5-api-order to ...