hdu 4559 涂色游戏(SG)

在一个2*N的格子上染色 每次可以染1*1的格子 或者2*2的格子 最涂满所有格子的人胜 m为已染色格子的个数 Alice先手

1*1的点SG值为1 SG【i】表示连续2*i的SG值 sg【3】 就是连续2*3空白格子

假如n = 3
涂一个1*1个格子的情况 那么后继状态就可能是
状态1 连续0列的格子+连续2列的格子+剩余那一列涂1个格子
状态2 连续1列的格子+连续1列的格子+剩余那一列涂1个格子

涂一个2*3个格子的情况 那么后继状态就可能是
状态1 连续0列的格子+连续1列的格子+剩余的2*2格子

最后对整个棋盘分段 连续空白的2*i格子 和 某列中涂过色的格子

Sample Input
2
2 0 // n m
2 2 //n m
1 1 //已染色格子的坐标
2 2

Sample Output
Case 1: Alice
Case 2: Bob

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <algorithm>
 5 # include <string>
 6 # include <cmath>
 7 # include <queue>
 8 # include <list>
 9 # define LL long long
10 using namespace std ;
11 const int MAXN=5000;
12 int sg[MAXN];
13 bool vis[MAXN];
14 bool g[2][MAXN];
15 int mex(int x)
16 {
17     if(sg[x]!=-1)return sg[x];
18     memset(vis,false,sizeof(vis));
19     for(int i=0;i<=x-1-i;i++)  //染1*1
20     {
21         int tmp=mex(i)^mex(x-1-i)^1;
22         vis[tmp]=true;
23     }
24     for(int i=0;i<=x-2-i;i++)//染2*2
25     {
26         int tmp=mex(i)^mex(x-2-i);
27         vis[tmp]=true;
28     }
29     for(int i=0;;i++)
30         if(!vis[i])
31         {
32             sg[x]=i;
33             break;
34         }
35     return sg[x];
36 }
37
38 int main()
39 {
40
41     memset(sg,-1,sizeof(sg));
42     sg[0]=0;
43     for(int i=1;i<5000;i++)
44         sg[i]=mex(i);
45     int T;
46     scanf("%d",&T);
47     int iCase=0;
48     while(T--)
49     {
50         int n,m;
51         scanf("%d%d",&n,&m);
52         memset(g,false,sizeof(g));
53         int u,v;
54         while(m--)
55         {
56             scanf("%d%d",&u,&v);
57             u--;v--;
58             g[u][v]=true;
59         }
60         int len=0;
61         int ans=0;
62         for(int i=0;i<n;i++)
63         {
64             if(g[0][i]||g[1][i])
65             {
66                 ans^=sg[len];
67                 len=0;
68                 if(g[0][i]&&g[1][i])continue;
69                 ans^=1;
70             }
71             else len++;
72         }
73         ans^=sg[len];
74         iCase++;
75         if(ans)printf("Case %d: Alice\n",iCase);
76         else printf("Case %d: Bob\n",iCase);
77     }
78     return 0;
79 }

时间: 2024-08-04 18:24:13

hdu 4559 涂色游戏(SG)的相关文章

涂色游戏

Description 在一个1*N的格子上,每个格子可以选择涂成红色或蓝色. 求至少 M 个连续为红色的方案数. Input 多组输入,每组输入包含两个整数M和N  (0<N,M<100000) Output 输出存在至少连续M个为红色的方案数,对1000000007取模 Sample Input 3 4 Sample Output 3 这道题有点意思,基本就是核电站问题的翻版 基本思路就是,还是和核电站一样,要考虑前几个格子避免连续n个红格子的思路 嗯,忘了刚才那句吧,我再说一遍 f[i]

涂色游戏 题解

bsoj6412 没找到出处... 题意简述:给一颗树,一次操作定义为随机选择一个点,染掉该点和它周围一圈的点,问期望多少次染黑所有点. 这是道好题啊!全面考察了容斥.反演.期望和dp,有许多值得注意的细节. 一.做法1(容斥/二项式反演+dp) 1.1 化式子 首先肯定第一个想到的式子就是 \[ Ans = \sum_{i=1}^{\infty} i * P(在染第i次时刚好黑完) \] 这是根据期望的定义直接得到的. 然后发现这个\(i\)实在是非常的恶心,因为它居然和无穷有关.但既然是一个

HDU 4365 正方形格子涂色中心对称轴对称的涂法有多少种-思维-(矩阵坐标关系&amp;快速幂取模)

题意:n*n的格子,涂色,有k种颜料,必须满足旋转任意个90度和翻转之后图片的样子不变,现在已经有m个格子涂过色了,问还有多少种涂法满足上述条件. 分析: 满足上述对称条件,那么涂色的种类问题我们可以放在正方形的一个角来做,因为一个角确定了其他角的颜色也就确定了. 以左上角的下半角为例.共有1+2+....+(n+1)/2个格子,然后记录涂过色的格子对应到这个三角形里的格子数目,用tot来记录,即每输入一个涂过色的格子的坐标我们就在这个三角形里找与之对应的坐标,用vis[][]数组标记是否已经计

2014ACM/ICPC亚洲区北京站-重现赛 [B.Black And White] 涂色DFS

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5113 题目大意:在一个N * M的棋盘里涂色,要求i颜色要涂ci次.ci求和为N * M. 关键思想:从第一个点开始着色,一行一行涂,注意一旦找到答案后面就不必搜,当剩下个数为n时若有种颜色>n/2上取整就不必搜了(!). #include <iostream> #include <iomanip> #include <cstdio> #include <cst

hdu5386 棋盘涂色模拟

http://acm.hdu.edu.cn/showproblem.php?pid=5386 Problem Description You have an  matrix.Every grid has a color.Now there are two types of operating: L x y: for(int i=1;i<=n;i++)color[i][x]=y; H x y:for(int i=1;i<=n;i++)color[x][i]=y; Now give you the

组合游戏 - SG函数和SG定理

在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念: P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败. N点:必胜点,处于此情况下,双方操作均正确的情况下必胜. 必胜点和必败点的性质: 1.所有终结点是 必败点 P .(我们以此为基本前提进行推理,换句话说,我们以此为假设) 2.从任何必胜点N 操作,至少有一种方式可以进入必败点 P. 3.无论如何操作,必败点P 都只能进入 必胜点 N. 我们研究必胜点和必败点的目的时间为题进行简化,有助于

BZOJ 1260 [CQOI2007]涂色paint(区间DP)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1260 [题目大意] 假设你有一条长度为n的木版,初始时没有涂过任何颜色 每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色 求最少的涂色次数达到目标状态 [题解] dp[i][j]表示涂抹i到j的最优答案, 显然当i和j相同时,可以从i+1……j,i……j-1,i+1……j-1转移过来, 同时也可以从两个区间组合得到. [代码] #include <cstdio>

HDU 1527 取石子游戏 威佐夫博弈

题目来源:HDU 1527 取石子游戏 题意:中文 思路:威佐夫博弈 必败态为 (a,b ) ai + i = bi     ai = i*(1+sqrt(5.0)+1)/2   这题就求出i然后带人i和i+1判断是否成立 以下转自网上某总结 有公式ak =[k(1+√5)/2],bk= ak + k  (k=0,1,2,-,n 方括号表示取整函数) 其中出现了黄金分割数(1+√5)/2 = 1.618-,因此,由ak,bk组成的矩形近似为黄金矩形 由于2/(1+√5)=(√5-1)/2,可以先

POJ 1129 Channel Allocation(暴力搜--涂色问题)

Channel Allocation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13295   Accepted: 6806 Description When a radio station is broadcasting over a very large area, repeaters are used to retransmit the signal so that every receiver has a s