题目地址:

https://www.acwing.com/problem/content/911/

给定一个有向无环图作为棋盘,棋盘上有 M M M个棋子,多个棋子可以放到棋盘中的同一个点上。两名玩家在棋盘上进行游戏,每名玩家每回合需要移动任意一个棋子沿着一条有向边移动至与它相邻的任意一个点上。当轮到一名玩家时,该玩家如果无法移动任何棋子,则视为游戏失败。请问先手是否必胜。

输入格式:
第一行包含整数 N N N,表示图中共有 N N N个点。
接下来 N N N行,每行包含若干个整数,第一个整数 X i X_i Xi​表示从编号为 i i i的点出发的有向边的条数,接下来 X i X_i Xi​个数字表示每条有向边的终点。
点的编号为 0 0 0到 N − 1 N−1 N−1,上述 N N N行数据按顺序依次介绍由 0 ∼ N − 1 0∼N−1 0∼N−1号点出发的有向边的条数和每条边的终点。
再接下来若干行是询问,每行首先包含一个整数 M M M,表示一组询问中的棋子个数,接下来包含 M M M个整数,表示 M M M个棋子所在的初始点的编号。
最后一行为一个整数 0 0 0,表示输入结束。

输出格式:
每组询问输出一个结果,每个结果占一行,如果先手必胜则输出WIN,否则输出LOSE

数据范围:
1 ≤ N ≤ 10000 1≤N≤10000 1≤N≤10000
1 ≤ M ≤ 10 1≤M≤10 1≤M≤10
数据保证图中边的数量不会超过 1 0 5 10^5 105条。
询问次数不会超过 10000 10000 10000次。

可以用SG函数做。参考https://blog.csdn.net/qq_46105170/article/details/114006814。对于本题的有向图,可以先求出每个点的SG函数值,由于棋子之间互相独立,可以看成是 M M M个独立的游戏在同时进行,那么由SG定理,只需要把所有棋子的初始位置的SG函数做一下异或,如果非零,则先手必胜,否则先手必败。代码如下:

#include <iostream>
#include <cstring>
#include <unordered_set>
using namespace std;const int N = 10010, M = N * 10;
int n, m;
int h[N], e[M], ne[M], idx;
int f[N];void add(int a, int b) {e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}int sg(int x) {if (~f[x]) return f[x];unordered_set<int> st;for (int i = h[x]; ~i; i = ne[i])st.insert(sg(e[i]));for (int i = 0;; i++)if (!st.count(i)) return f[x] = i;
}int main() {memset(h, -1, sizeof h);scanf("%d", &n);for (int i = 0; i < n; i++) {scanf("%d", &m);while (m--) {int x;scanf("%d", &x);add(i, x);}}memset(f, -1, sizeof f);while (cin >> m, m) {int res = 0;while (m--) {int x;scanf("%d", &x);res ^= sg(x);}res ? puts("WIN") : puts("LOSE");}
}

预处理时间复杂度 O ( N M ) O(NM) O(NM)(可以将算SG函数的时间都算作是预处理),每次询问时间复杂度 O ( M ) O(M) O(M),空间 O ( N M ) O(NM) O(NM)。

【ACWing】909. 下棋游戏相关推荐

  1. 【Acwing 219. 剪纸游戏】

    [Acwing 219. 剪纸游戏] 题意: 给定一张 N×M 的矩形网格纸,两名玩家轮流行动. 在每一次行动中,可以任选一张矩形网格纸,沿着某一行或某一列的格线,把它剪成两部分. 首先剪出 1×1 ...

  2. Acwing 1084. 数字游戏 II

    Acwing 1084. 数字游戏 II 题意: 指定一个整数闭区间 [a.b],问这个区间内有多少个取模数. 取模数:这种数字必须满足各位数字之和 mod N 为 0. 题解: 数位dp 这里不细讲 ...

  3. Acwing 1082. 数字游戏

    Acwing 1082. 数字游戏 题意: 现在大家决定玩一个游戏,指定一个整数闭区间 [a,b],问这个区间内有多少个不降数. 题解: 利用数位dp的套路来做 我们还是利用前缀和来做 我们先求1~n ...

  4. AcWing 1695. 果壳游戏

    AcWing 1695. 果壳游戏 题目链接 题目描述: 为了消磨时光,奶牛 Bessie 和她的朋友 Elsie 喜欢玩一种她们在农业展览会上看到的游戏. 游戏准备阶段,Bessie 在桌子上放置三 ...

  5. IDA* AcWing 181. 回转游戏

    IDA* AcWing 181. 回转游戏 原题链接 AcWing 181. 回转游戏 算法标签 搜索 IDA* 思路 本题采用 IDA* 算法,即迭代加深的 A* 算法. 估价函数: 统计中间8个方 ...

  6. 算法提高课-图论-欧拉回路和欧拉路径-AcWing 1185. 单词游戏:判断有向图是否存在欧拉路径、并查集

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 把每个单词看成一条边!!!首字母到尾字母的一条边,最多共有26个点(26个小写的英文字母),然后问能否把所有边串起来. 其实,对欧拉 ...

  7. AcWing 1813. 方块游戏(暴力枚举)

    题面链接 https://www.acwing.com/problem/content/1815/ 思路 每次读入两个字符串的时候我们只需要将其中每个字母较多的一方计算入ans中即可,因为不会发生同时 ...

  8. AcWing 891. Nim游戏(nim博弈)

    题目链接 https://www.acwing.com/problem/content/893/ 思路 这个题目需要清楚一个概念: 必胜态:我们能通过一个操作使得局面变成必败态 必败态:无论如何操作都 ...

  9. AcWing 1695 果壳游戏

    题目描述 为了消磨时光,奶牛 Bessie 和她的朋友 Elsie 喜欢玩一种她们在农业展览会上看到的游戏. 游戏准备阶段,Bessie 在桌子上放置三个倒置的坚果壳,1号坚果壳放在位置1,2号坚果壳 ...

最新文章

  1. ABAP性能优化之修改一组纪录
  2. oracle number类型能存空吗_《听雪楼》《白发》成爆款类型剧的效仿者,古装剧真的能回暖吗?...
  3. BufferedWriter_字符缓冲输出流
  4. MOSS 代替Spring Boot Admin 的服务治理工具
  5. *【CodeForces - 1088 ABC】套题比赛,A水题B模拟C构造D交互
  6. oracle 嵌套游标慢,oracle 嵌套游标以及java,oracle的时间处理
  7. 如何获取Agile PLM Business Object 对应Agile对象的属性?
  8. 1614700501
  9. python睡眠_Python时间睡眠()
  10. 前端 后端 MD5加盐
  11. 小黄鸟(HTTPCanary)安装及Android高版本CA证书配置
  12. [论文阅读]DynaSLAM II: Tightly-Coupled Multi-Object Tracking and SLAM
  13. 自然语言处理 文本数据分析
  14. 墨尘 - UE4 入门教程笔记 —— 二
  15. 开源手游暗黑世界客户端部分代码注解续
  16. [笔记]NFC笔记——WUP_REQ 和 WUP_RES 消息结构
  17. js制作点击会自动隐藏的导航栏(固定在在头部的)
  18. Linux云计算之VSFTP服务器概述-安装vsftp服务器端、客户端
  19. pfa100_漂莱特PFA100微电子和半导体工业及医药行业超纯水设备树脂
  20. 大四找完工作随便写写

热门文章

  1. IPv4 Type of Service服务类型(TOS)字段
  2. IRQF_ONESHOT
  3. Perl 正则表达式 模式匹配
  4. 简单的理解position与anchorPoint
  5. 华为MIB关键字IOD查询地址及方法
  6. python递归算法 - 汉诺塔问题
  7. C语言1.5e10什么意思,汽车排量1.5e是什么意思
  8. 最全的Android单元测试教程
  9. 【翻译】Wide Deep Learning for Recommender Systems--推荐系统的广泛深度学习
  10. 三千年读史,不外乎功名利禄。九万里悟道,终归诗酒田园。