ABC206 F - Interval Game 2 (区间DP,博弈论,SG函数)
题面
A
l
i
c
e
\tt Alice
Alice 和
B
o
b
\tt Bob
Bob 在博弈。摆在他们面前有
N
\rm N
N 个区间
[
l
i
,
r
i
)
\rm[l_i,r_i)
[li,ri) ,每人轮流取出一个区间,放到数轴上,要求取出的区间与当前数轴上的任意区间交集为
∅
\rm\empty
∅ 。
A
l
i
c
e
\tt Alice
Alice 先手。
T
(
1
≤
T
≤
20
)
\rm T(1\leq T\leq20)
T(1≤T≤20) 组数据,每组数据给出
N
(
1
≤
N
≤
100
)
\rm N(1\leq N\leq100)
N(1≤N≤100) 和每个区间
[
l
i
,
r
i
)
\rm[l_i,r_i)
[li,ri),
1
≤
l
i
<
r
i
≤
100
\rm1\leq l_i<r_i\leq100
1≤li<ri≤100 。
对于每组数据输出
A
l
i
c
e
\tt Alice
Alice 必胜还是
B
o
b
\tt Bob
Bob 必胜。
题解
前置知识:SG函数
通过SG定理的学习,我们知道一个游戏先手必败当且仅当SG值为
0
0
0,且多个子游戏同时进行的情况下,总游戏的SG值为每个子游戏SG值的异或和。
这道题怎么应用呢?
毫无疑问,
2
N
\rm 2^N
2N 的算法是不行的,那我们怎么表示总游戏的状态呢?
我们表示不出来!但是我们会发现,总游戏可以分成多个互不干扰的子游戏,而每个子游戏是可以用一个区间
[
L
,
R
)
\rm[L,R)
[L,R) 表示状态的!意为左右端点都在
[
L
,
R
)
\rm[L,R)
[L,R) 内的所有区间
[
l
i
,
r
i
)
\rm[l_i,r_i)
[li,ri) 组成的子游戏。因为每个子游戏成为无法拆分的一部分时,意味着这个范围内的区间彼此通过非空的交集连通在一起,并且
[
L
,
R
)
\rm[L,R)
[L,R) 内的所有区间都没被取走。
如果在某个子游戏的范围
[
L
,
R
)
\rm[L,R)
[L,R) 内取走了一个区间
[
l
,
r
)
\rm[l,r)
[l,r),那么这个子游戏就会被分成两个独立子游戏
[
L
,
l
)
\rm[L,l)
[L,l) 和
[
r
,
R
)
\rm[r,R)
[r,R)。与之前做过的一道题【CF1523G】Try Booking 类似,并不难理解。
此外,如果对于两个子游戏
[
L
,
R
)
\rm[L,R)
[L,R) 和
[
L
′
,
R
′
)
\rm[L',R')
[L′,R′) ,在
[
L
,
R
′
)
\rm[L,R')
[L,R′) 范围内的区间都没被取走的话,是可以把两个子游戏合并为游戏
[
L
,
R
′
)
\rm[L,R')
[L,R′) 的,这不影响。
于是我们可以区间
D
P
\tt DP
DP 了,令
S
G
L
,
R
\rm SG_{L,R}
SGL,R 表示游戏
[
L
,
R
)
\rm[L,R)
[L,R) 的SG函数值,那么就可以转移了:(
m
e
x
\rm mex
mex 是什么意思不用赘述了吧)
S
G
L
,
R
=
m
e
x
{
(
S
G
L
,
l
i
x
o
r
S
G
r
i
,
R
)
∣
[
l
i
,
r
i
)
⊆
[
L
,
R
)
}
\rm SG_{L,R}=mex\,\{(SG_{L,l_i}~{\tt xor}~SG_{r_i,R})~|~[l_i,r_i)\sube[L,R)\}
SGL,R=mex{(SGL,li xor SGri,R) ∣ [li,ri)⊆[L,R)}
这里有个小细节:计算SG函数值时,如果是递归,那么只能开临时数组。原因不用赘述。
时间复杂度
O
(
T
⋅
∣
U
∣
2
⋅
N
)
\rm O(T\cdot|U|^2\cdot N)
O(T⋅∣U∣2⋅N) 。
CODE
用 dp 代替了 SG 。
#include<map>
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 105
#define DB double
#define LL long long
#define ENDL putchar('\n')
#define lowbit(x) ((-x) & (x))
LL read() {
LL f=1,x=0;char s = getchar();
while(s < '0' || s > '9') {if(s=='-')f = -f;s = getchar();}
while(s >= '0' && s <= '9') {x=x*10+(s-'0');s = getchar();}
return f * x;
}
int n,m,i,j,s,o,k;
int L[MAXN],R[MAXN];
vector<int> bu[MAXN];
bool f[MAXN][MAXN];
int dp[MAXN][MAXN];
bool tmp[105];
int solve(int l,int r) {
if(l>r) return 0;
if(f[l][r]) return dp[l][r];
f[l][r] = 1;
int tmp[105];
memset(tmp,0,sizeof(tmp));
for(int i = l;i <= r;i ++) {
for(int j = 0;j < (int)bu[i].size();j ++) {
int ll = L[bu[i][j]],rr = R[bu[i][j]];
if(rr <= r) {
tmp[solve(l,ll) ^ solve(rr,r)] = 1;
}
}
}
for(int i = 0;i <= 101;i ++) {
if(!tmp[i]) {
dp[l][r] = i;
break;
}
}
return dp[l][r];
}
int main() {
int T = read();
while(T --) {
n = read();
for(int i = 1;i <= 100;i ++) bu[i].clear();
memset(f,0,sizeof(f));
memset(dp,0,sizeof(dp));
for(int i = 1;i <= n;i ++) {
L[i] = read();R[i] = read();
bu[L[i]].push_back(i);
}
int ans = solve(1,100);
printf(ans>0 ? "Alice\n":"Bob\n");
}
return 0;
}
ABC206 F - Interval Game 2 (区间DP,博弈论,SG函数)的更多相关文章
- 6.15 省选模拟赛 老魔杖 博弈论 SG函数
这道题确实没有一个很好的解决办法 唯一的正解可能就是打表找规律 或者 直接猜结论了吧. 尽管如此 在此也给最终结论一个完整的证明. 对于70分 容易发现状态数量不大 可以进行暴力dp求SG函数. 原本 ...
- Gym - 101196:F Removal Game(区间DP)
题意:一个环状数组,给定可以删去一个数,代价的相邻两个数的gcd,求最小代价. 思路:区间DP即可,dp[i][j]表示[i,j]区间只剩下i和j时的最小代价,那么dp[i][j]=min dp[i ...
- 【基础操作】博弈论 / SG 函数详解
博弈死我了……(话说哪个小学生会玩博弈论提到的这类弱智游戏,还取石子) 先推荐两个文章链接:浅谈算法——博弈论(从零开始的博弈论) 博弈论相关知识及其应用 This article was updat ...
- POJ2425 A Chess Game[博弈论 SG函数]
A Chess Game Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 3917 Accepted: 1596 Desc ...
- JZYZOJ1540 BZOJ4035 [ haoi2015 上午] T3 博弈论 sg函数 分块 haoi
http://172.20.6.3/Problem_Show.asp?id=1540 之前莫比乌斯反演也写了一道这种找规律分块计算的题,没觉得这么恶心啊. 具体解释看代码. 翻硬币的具体方法就是分别算 ...
- POJ 2960 S-Nim 博弈论 sg函数
http://poj.org/problem?id=2960 sg函数几乎是模板题. 调试代码的最大障碍仍然是手残在循环里打错变量名,是时候换个hydra产的机械臂了[超想要.jpg] #includ ...
- POJ 2425 A Chess Game 博弈论 sg函数
http://poj.org/problem?id=2425 典型的sg函数,建图搜sg函数预处理之后直接求每次游戏的异或和.仍然是因为看不懂题目卡了好久. 这道题大概有两个坑, 1.是搜索的时候vi ...
- eduCF#61 F. Clear the String /// 区间DP 消除连续一段相同字符 全部消完的最少次数
题目大意: 给定字符串 每次消除可消除连续的一段相同的字符的子串 求消除整个字符串的最少消除次数 #include <bits/stdc++.h> using namespace std; ...
- UVa 1378 A Funny Stone Game [博弈论 SG函数]
A Funny Stone Game 题意: $n \le 23$堆石子,每次选择$i < j \le k$,从$i$拿走1颗$j,k$各放入一颗,不能取就失败.求先手是否必胜以及第一次取的策略 ...
随机推荐
- Python数据分析--Numpy常用函数介绍(6)--Numpy中矩阵和通用函数
在NumPy中,矩阵是 ndarray 的子类,与数学概念中的矩阵一样,NumPy中的矩阵也是二维的,可以使用 mat . matrix 以及 bmat 函数来创建矩阵. 一.创建矩阵 mat 函数创 ...
- SQL的语法
SQL的语法 SQL通用语法 SQL语句可以单行或多行书写,以分号(";")结尾. SQL语句可以使用空格或缩进增强可读性. MySQL数据库的SQL语句不区分大小写(建议关键字大 ...
- 基于SqlSugar的开发框架循序渐进介绍(7)-- 在文件上传模块中采用选项模式【Options】处理常规上传和FTP文件上传
在基于SqlSugar的开发框架的服务层中处理文件上传的时候,我们一般有两种处理方式,一种是常规的把文件存储在本地文件系统中,一种是通过FTP方式存储到指定的FTP服务器上.这种处理应该由程序进行配置 ...
- (数据科学学习手札139)geopandas 0.11版本重要新特性一览
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,就在几天前,geopandas ...
- .NET程序配置文件操作(ini,cfg,config)
在程序开发过程中,我们一般会用到配置文件来设定一些参数.常见的配置文件格式为 ini, xml, config等. INI .ini文件,通常为初始化文件,是用来存储程序配置信息的文本文件. [Log ...
- 扩展新的WCV到标准的WC后,不能在业务角色里面看见视图解决方法
by zyi 感谢群主红枣的分享 1.把你的WCVIEW扩展进WC中 2.使用UI Designer打开你的WCVIEW 3.更改你的WCVIEW名字
- 【Azure Developer】记录一次使用Java Azure Key Vault Secret示例代码生成的Jar包,单独运行出现 no main manifest attribute, in target/demo-1.0-SNAPSHOT.jar 错误消息
问题描述 创建一个Java Console程序,用于使用Azure Key Vault Secret.在VS Code中能正常Debug,但是通过mvn clean package打包为jar文件后, ...
- Halcon 条形码识别
read_image (Image, 'C:/Users/HJ/Desktop/test_image/image.png') create_bar_code_model([], [], BarCode ...
- 数据孤岛下的新破局 Real Time DaaS:面向 AP+TP 业务的数据平台架构
从传统数仓,到大数据平台,再到数据中台和湖仓一体新数据平台,在日益加重的数据孤岛困扰下,面向AP场景的解决方案可谓浩如烟海.但实际上,企业在TP类型业务上的投入和AP的比率却高达9:1,为什么没有为T ...
- Java 插入公式到PPT幻灯片
PowerPoint幻灯片中可插入公式,用于在幻灯片放映时演示相关内容的论证.推算的依据,能有效地为演讲者提供论述的数据支撑.通过后端程序代码,我们可借助特定的工具来实现在幻灯片中的插入公式,本文,将 ...