Luogu 2575 高手过招-SG函数

Solution

SG函数跑一遍就过了ouo

Code

 1 #include<cstring>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #define rd read()
 5 #define cl(a) memset(a, 0, sizeof(a));
 6 using namespace std;
 7
 8 const int N = 1 << 21;
 9
10 int SG[N], S[500];
11 int T, n;
12
13 int read() {
14     int X = 0, p = 1; char c = getchar();
15     for(; c > ‘9‘ ||  c < ‘0‘; c = getchar()) if(c == ‘-‘) p = -1;
16     for(; c >= ‘0‘ && c <= ‘9‘; c = getchar()) X = X * 10 + c - ‘0‘;
17     return X * p;
18 }
19
20 void mkSG() {
21     for(int i = 0; i < 20; ++i) SG[i] = 0;
22     for(int i = 1; i < (1 << 20); ++i) {
23         cl(S);
24         int last = -1, nt;
25         for(int j = 0; j < 20; ++j) if((i >> j) & 1) {
26             if(~last) {
27                 nt = i | (1 << last);
28                 nt ^= 1 << j;
29                 S[SG[nt]] = 1;
30             }
31         } else last = j;
32         int j = 0;
33         for(; S[j]; ++j);
34         SG[i] = j;
35     }
36 }
37
38 int main()
39 {
40     mkSG();
41     T = rd;
42     for(; T; T--) {
43         n = rd;
44         int ans = 0;
45         for(int i = 1; i <= n; ++i) {
46             int m = rd, tmp = 0;
47             for(int j = 1; j <= m; ++j) {
48                 int x = rd;
49                 tmp |= 1 << (20 - x);
50             }
51             ans ^= SG[tmp];
52         }
53         if(ans) puts("YES");
54         else puts("NO");
55     }
56 }

原文地址:https://www.cnblogs.com/cychester/p/9606644.html

时间: 2024-10-09 11:53:22

Luogu 2575 高手过招-SG函数的相关文章

博弈算法 之 SG 函数的运用

SG函数简介: 如果我们把游戏中的某一个局面看作一个顶点,把局面之间的转换用边来表示,那么很多游戏都可以转 化成图游戏模型. 图游戏模型 给定有向无环图G=(V,E)和一个起始点,双方轮流行动.每个人每次可以从当前点出发沿着 一条有向边走到另外一个点.谁无法走了谁就输. 一些图游戏可以通过Sprague-Grundy函数来判定先手的胜负情况(简称SG函数). SG函数 一个图G=(V,E)的SG函数g,是定义在v上的一个非负整数函数: g(x)=min{n>=0 | n≠g(y) for <x

P2575 高手过招

题目描述 AKN玩游戏玩累了,于是他开始和同伴下棋了,玩的是跳棋!对手是wwx!这两位上古神遇在一起下棋,使得棋局变得玄幻莫测,高手过招,必有一赢,他们都将用最佳策略下棋,现在给你一个n*20的棋盘,以及棋盘上有若干个棋子,问谁赢?akn先手! 游戏规则是这样的: 对于一个棋子,能将它向右移动一格,如果右边有棋子,则向右跳到第一个空格,如果右边没有空格,则不能移动这个棋子,如果所有棋子都不能移动,那么将输掉这场比赛. 输入格式 第一行一个T,表示T组数据 每组数据第一行n,表示n*20的棋盘 接

TYVJ 2049 魔法珠 sg函数

题意:链接 方法:sg函数 解析: tyvj的题大部分都没题解啊- - 不过这样貌似会更好?感觉做这的题都需要自己动脑啊- - 虽然嘴上说着好烦然而心里觉得好评? 回归正题 设sg[x]表示数x的sg值,这好像是废话 然后对于读入的a[i],将所有的a[i]的sg值异或起来如果不是零则先手赢反之后手 维护的时候有个坑. 每次求约数的时候,数组要在sg里开,因为如果递归下去的话,全局变量的话会被更改,会被坑死. 然后就是怎么维护了 对于x,先求约数 之后枚举哪个数不取,将其他的异或(或者先都异或起

hdu1848 Fibonacci again and again(SG函数博弈)

现在换是看不明白SG函数的求法什么的 暂时先当模板题吧 函数mex1就是求g(x) 然后异或 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; int k,fibo[100],f[10001]; int mex1(int p){ int i,t; bool g[101]={0}; for(i=0;i<k;i++){

HDU 2897-邂逅明下(sg函数)

邂逅明下 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2897 Appoint description:  System Crawler  (2015-03-13) Description 当日遇到月,于是有了明.当我遇到了你,便成了侣. 那天,日月相会,我见到了你.而且,大地失去了光辉,你我是否成侣?这注定是个凄美的故事.(以上是废

hdu 1536 S-Nim 博弈论,,求出SG&#39;函数就可以解决

S-Nim Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4975    Accepted Submission(s): 2141 Problem Description Arthur and his sister Caroll have been playing a game called Nim for some time now

SG函数

转自:Angel_Kitty Sprague-Grundy定理(SG定理): 游戏和的SG函数等于各个游戏SG函数的Nim和.这样就可以将每一个子游戏分而治之,从而简化了问题.而Bouton定理就是Sprague-Grundy定理在Nim游戏中的直接应用,因为单堆的Nim游戏 SG函数满足 SG(x) = x.对博弈不是很清楚的请参照http://www.cnblogs.com/ECJTUACM-873284962/p/6398385.html进行进一步理解. SG函数: 首先定义mex(min

算法笔记--sg函数详解及其模板

sg函数大神详解:http://blog.csdn.net/luomingjun12315/article/details/45555495 模板: int f[N],SG[N]; bool S[M]; void getSG(int n) { memset(SG,0,sizeof(SG)); for(int i=1;i<=n;i++) { memset(S,false,sizeof(S)); for(int j=1;f[j]<=i&&j<M;j++) { S[SG[i-f

Nim 游戏、SG 函数、游戏的和

Nim游戏 Nim游戏定义 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于"Impartial Combinatorial Games"(以下简称ICG).满足以下条件的游戏是ICG(可能不太严谨):1.有两名选手:2.两名选手交替对游戏进行移动(move),每次一步,选手可以在(一般而言)有限的合法移动集合中任选一种进行移动:3.对于游戏的任何一种可能的局面,合法的移动集合只取决于这个局面本身,不取决于轮到哪名选手操作.以前的任何操作.骰子的点数