题目大意

额,写来写去,我还是直接说抽象之后的题目大意吧:

有一个 r*2 的矩形,两个人轮流的在矩形上面减去一个 1*1 的小正方形,要求在减的过程中,不能使矩形“断开”,也就是说,如果一个人减去了 (i, 1) 这个矩形,那么,(i-1, 2), (i+1, 2), (i, 2) 这三个小正方形不能再被减去了,因为一旦减去它们中的一个,整个矩形就会被“剪断”

现在给你一个 r 和 n (1 ≤ r ≤ 100, 0 ≤ n ≤ r),表示有一个 r*2 矩形,已经有了 n 个位置被减去了,再给 n 个位置的坐标,题目保证开始的状态矩形不会被剪断.

现在问,对于当前的状态,先手是否必胜

做法分析

这题是博弈已经没得说了,而且,很明显是游戏的和的问题,必然是爆 sg 函数了

先来看看怎么表示状态:sg[len][x][y] 表示,有一个长度为 len 的矩形,它的 len*2 个小正方形都在,最左边的一个小正方形只能按照 x 的方式剪掉,最右边的一个小正方形只能按照 y 的方式剪掉,其中:x=1 或者 y=1 表示剪掉的是第一排的矩形,x=2 或者 y=2 表示剪掉的是第二排的矩形,x=0 或者 y=0 表示没有限制,即:可以剪掉第一排的也可以剪掉第二排的

那么,当 len=0 的时候,必然有 sg[0][x][y]=0,其中 0≤x≤2, 0≤y≤2

当 len=1 的时候,必然有 sg[1][1][2]=sg[1][2][1]=0, sg[1][1][1]=sg[1][2][2]=sg[1][0][x]=sg[1][x][0]=1,其中 0≤x≤2

根据状态的定义,当前状态的下一个子状态也很好确定,先记忆化搜索将 sg 函数暴力出来

然后,根据输入的矩形,将举行分解成若干个子矩形,每个子矩形都应该尽量大,这样,每个子矩形必然属于上面提到的的一个状态之一

现在的游戏就变成了很多个游戏的和了,求出这些子游戏的 sg 值的异或和 sum,如果 sum!=0,先手必胜,否则先手必败

参考代码

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm> using namespace std; const int N=; int sg[N][][];
struct data {
int id, val;
bool operator < (const data &T) const {
return id<T.id;
}
} A[N]; int GET_SG(int len, int x, int y) {
if(sg[len][x][y]!=-) return sg[len][x][y]; if(len==) return sg[len][x][y]=sg[len][y][x]=;
if(x>y) swap(x, y);
if(len== && x== && y==) return sg[len][x][y]=sg[len][y][x]=;
if(len==) return sg[len][x][y]=sg[len][y][x]=; bool vs[N];
memset(vs, , sizeof vs);
for(int len1=; len1<len; len1++) {
int len2=len--len1;
if(len1==) {
if(x==) {
vs[GET_SG(len2, , y)]=;
vs[GET_SG(len2, , y)]=;
}
else vs[GET_SG(len2, x, y)]=;
}
else if(len2==) {
if(y==) {
vs[GET_SG(len1, x, )]=;
vs[GET_SG(len1, x, )]=;
}
else vs[GET_SG(len1, x, y)]=;
}
else {
vs[GET_SG(len1, x, )^GET_SG(len2, , y)]=;
vs[GET_SG(len1, x, )^GET_SG(len2, , y)]=;
}
}
for(int i=; i<N; i++) if(!vs[i]) return sg[len][x][y]=sg[len][y][x]=i;
} int main() {
memset(sg, -, sizeof sg);
for(int i=; i<=; i++)
for(int j=; j<; j++)
for(int k=; k<; k++) if(sg[i][j][k]==-) GET_SG(i, j, k);
for(int r, n; scanf("%d%d", &r, &n)!=EOF; ) {
for(int i=; i<=n; i++) scanf("%d%d", &A[i].id, &A[i].val);
A[].id=, A[].val=, A[n+].id=r+, A[n+].val=;
n+=;
sort(A, A+n);
int sum=;
for(int i=; i<n; i++) sum^=sg[A[i].id-A[i-].id-][A[i-].val][A[i].val];
if(sum) printf("WIN\n");
else printf("LOSE\n");
}
return ;
}

C. More Reclamation

题目链接 & AC 通道

MemSQL start[c]up Round 2 - online version C. More Reclamation

MemSQL start[c]up Round 2 - online version C. More Reclamation(博弈)的更多相关文章

  1. MemSQL start[c]up Round 2 - online version(DP)

    只有小写字母 那>=2600的直接找单字母串长度大于等于100的就可以了 <2600 的dp找最长回文串 #include <iostream> #include<cst ...

  2. codeforces MemSQL start[c]up Round 2 - online version B 最长公共子系列

    题目链接:  http://codeforces.com/contest/335/problem/B 分析: 第一眼看上去串的长度为5*10^4, 冒似只能用O(n)的算法可解. 而这样的算法从来没见 ...

  3. MemSQL start[c]up Round 1.b

    二分查找题, 不知道用double的人,用LL果断错了... B. Stadium and Games time limit per test 1 second memory limit per te ...

  4. MemSQL start[c]up Round 1 B题

    题目链接 http://codeforces.com/contest/325/problem/B 第一遍写了暴搜,果断TLE 然后上了二分,结果120组数据只有第40组过不了,我就写了奇怪的东西... ...

  5. MemSQL start[c]up Round 1.E

    完全的乱搞题啊... 被坑的要死. 拿到题目就觉得是规律题加构造题, 然后找了了几个小时无果,只知道n为奇数的时候是一定无解的,然后当n为偶数的时候可能有很多解,但是如果乱选择的话,很有可能形成无解的 ...

  6. Codeforces Round #459 (Div. 2) D. MADMAX DFS+博弈

    D. MADMAX time limit per test 1 second memory limit per test 256 megabytes input standard input outp ...

  7. Codeforces Round #651 (Div. 2) C. Number Game (博弈,数学)

    题意:对于正整数\(n\),每次可以选择使它变为\(n-1\)或者\(n/t\) (\(n\ mod\ t=0\)且\(t\)为奇数),当\(n=1\)时便不可以再取,问先手赢还是后手赢. 题解:首先 ...

  8. JAVA入门[14]-Spring MVC AOP

    一.基本概念 1.AOP简介 DI能够让相互协作的软件组件保持松散耦合:而面向切面编程(aspect-oriented programming,AOP)允许你把遍布应用各处的功能分离出来形成可重用的组 ...

  9. 【概念】SVG(1)

    ok,我们讲讲svg 学习前提:懂HTML和基本的XML SVG简介: 1.SVG全称Scable Vector Graphic,可伸缩的矢量图 2.SVG用于定义针对于Web的基于矢量的图形 3.S ...

随机推荐

  1. iOS YSAuth 第三方登录及分享

    概述 在很多时候,我们使用的都是第三方插件来处理登录与分享,比如使用友盟.但要是我们需要自己写一套自己的登录.分享.支付的时候,就可以使用YSAuth这个类库. github:https://gith ...

  2. GCD中的dispatch_sync、dispatch_sync 分别与串行、并行队列组合执行小实验

    平常开发中会经常用gcd做一下多线程任务,但一直没有对同步.异步任务在串行.并行队列的执行情况做个全面的认识,今天写了个demo跑了下,还是有些新发现的. 代码如下: - (void)touchesB ...

  3. Leetcode 278 First Bad Version 二分查找(二分下标)

    题意:找到第一个出问题的版本 二分查找,注意 mid = l + (r - l + 1) / 2;因为整数会溢出 // Forward declaration of isBadVersion API. ...

  4. 前端与Server端(路由)

    路由(前端):原理:只有几个XHR请求,就能实现页面无刷新闪烁更改URL 前端:1. ajax承担数据通信以及相对应的逻辑(交互逻辑) ajax进行数据交互,跟URL打交道,让数据交互的变化反映到UR ...

  5. 纯css制作带三角border篇(兼容所有浏览器)

    今天帅哥给你们介绍下,如何用 border 来制作三角. html 代码如下: 复制代码 代码如下: <div class="arrow-up"></div> ...

  6. 关于iis7短日期后面带有星期的解决办法

    以下方法试验无效: 在“控制面板”,在“区域和语言选项”中找到了“格式”设置,然后把短日期改成yyyy-M-D. 正确方法是修改注册表: /HKEY_USERS/.DEFAULT/Control Pa ...

  7. C# keybd_event模拟对照表以及用法.

    Windows提供了一个模拟键盘API函数Keybd_event(),该函数能触发一个按键事件,也就是说会产生一个WM_KEYDOWN或WM_KEYUP消息. [DllImport("use ...

  8. jackson json转实体 com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException

    jackson 2.2.2 由于vo中缺少json的某个字段属性引起 2种解决方法 1:vo中添加注解@JsonIgnoreProperties(ignoreUnknown = true) 2.  m ...

  9. Activemq消息类型

    Activemq消息类型JMS规范中的消息类型包括TextMessage.MapMessage.ObjectMessage.BytesMessage.和StreamMessage等五种.ActiveM ...

  10. Codeforces Round #381 (Div. 1) A. Alyona and mex 构造

    A. Alyona and mex 题目连接: http://codeforces.com/contest/739/problem/A Description Alyona's mother want ...