MemSQL start[c]up Round 2 - online version C. More Reclamation(博弈)
题目大意
额,写来写去,我还是直接说抽象之后的题目大意吧:
有一个 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(博弈)的更多相关文章
- MemSQL start[c]up Round 2 - online version(DP)
只有小写字母 那>=2600的直接找单字母串长度大于等于100的就可以了 <2600 的dp找最长回文串 #include <iostream> #include<cst ...
- codeforces MemSQL start[c]up Round 2 - online version B 最长公共子系列
题目链接: http://codeforces.com/contest/335/problem/B 分析: 第一眼看上去串的长度为5*10^4, 冒似只能用O(n)的算法可解. 而这样的算法从来没见 ...
- MemSQL start[c]up Round 1.b
二分查找题, 不知道用double的人,用LL果断错了... B. Stadium and Games time limit per test 1 second memory limit per te ...
- MemSQL start[c]up Round 1 B题
题目链接 http://codeforces.com/contest/325/problem/B 第一遍写了暴搜,果断TLE 然后上了二分,结果120组数据只有第40组过不了,我就写了奇怪的东西... ...
- MemSQL start[c]up Round 1.E
完全的乱搞题啊... 被坑的要死. 拿到题目就觉得是规律题加构造题, 然后找了了几个小时无果,只知道n为奇数的时候是一定无解的,然后当n为偶数的时候可能有很多解,但是如果乱选择的话,很有可能形成无解的 ...
- 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 ...
- Codeforces Round #651 (Div. 2) C. Number Game (博弈,数学)
题意:对于正整数\(n\),每次可以选择使它变为\(n-1\)或者\(n/t\) (\(n\ mod\ t=0\)且\(t\)为奇数),当\(n=1\)时便不可以再取,问先手赢还是后手赢. 题解:首先 ...
- JAVA入门[14]-Spring MVC AOP
一.基本概念 1.AOP简介 DI能够让相互协作的软件组件保持松散耦合:而面向切面编程(aspect-oriented programming,AOP)允许你把遍布应用各处的功能分离出来形成可重用的组 ...
- 【概念】SVG(1)
ok,我们讲讲svg 学习前提:懂HTML和基本的XML SVG简介: 1.SVG全称Scable Vector Graphic,可伸缩的矢量图 2.SVG用于定义针对于Web的基于矢量的图形 3.S ...
随机推荐
- atitit.sql server2008导出导入数据库大的表格文件... oracle mysql
atitit.sql server2008导出导入数据库大的表格文件... 1. 超过80M的文件是不能在查询分析器中执行的 1 2. Oracle ,mysql大的文件导入 1 2.1. 使用sql ...
- Mac OS X 系统下自带的文本文件格式转换工具iconv
1. utf-8 转 GBK的方法 在mac bash 中直接运行 iconv -f UTF-8 -t GBK test_utf8.txt > test_gbk.txt 举例:创建测试文件 ec ...
- Leetcode 125 Valid Palindrome 字符串处理
题意:判断字符串是否是回文字符串 先将所有的字母和数字字符保留,并将大写字母转化成小写字母,然后将字符串倒置,比较前后两个字符串是否相同. 该题最好的解法可以模仿 Leetcode 345 Rever ...
- iOS开发中使用CocoaPods来管理第三方的依赖程序
之前也碰到类似的问题,怎样去管理这些第三方的文件,虽然手动添加也不算麻烦. 写这篇文章主要参考了唐巧的博文,链接如下: http://blog.devtang.com/blog/2012/12/02/ ...
- C#/ASP.NET Xml多级数据读取
<Data> <Project> <Item Id="51351132-59a7-4c0b-909d-51b89b1c3159" IsDefault= ...
- 水星Mercury路由器端口映射设置图文方法
在一些内网的环境里,你可能需要把自己的内网的WEB服务器或者其他应用服务器设置成通过互联网可以访问,但是在内网我们是通过路由器共享上网的,外网无法访问到我们的内部服务器.那么这就需要我们通过" ...
- git在分支上创建目录和文件
创建一个空目录,在其中初始化git git init 创建一个新文件,此时默认在master分支上 touch file1.txt add到staging area git add file1.txt ...
- 多台linux服务器时间同步
1,设置A机时间服务器: a,修改 /etc/ntp.conf,如下: # Undisciplined Local Clock. This is a fake driver intended for ...
- 关于mysql备份说明
#mysqlpump压缩备份vs数据库 三个并发线程备份,消耗时间:222smysqlpump -uzjy -p -h192.168.123.70 --single-transaction --def ...
- phpredis中文手册——《redis中文手册》 php版
本文是参考<redis中文手册>,将示例代码用php来实现,注意php-redis与redis_cli的区别(主要是返回值类型和参数用法). 目录(使用CTRL+F快速查找命令): Key ...