题面

题意很简单

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函数)的更多相关文章

  1. 6.15 省选模拟赛 老魔杖 博弈论 SG函数

    这道题确实没有一个很好的解决办法 唯一的正解可能就是打表找规律 或者 直接猜结论了吧. 尽管如此 在此也给最终结论一个完整的证明. 对于70分 容易发现状态数量不大 可以进行暴力dp求SG函数. 原本 ...

  2. Gym - 101196:F Removal Game(区间DP)

    题意:一个环状数组,给定可以删去一个数,代价的相邻两个数的gcd,求最小代价. 思路:区间DP即可,dp[i][j]表示[i,j]区间只剩下i和j时的最小代价,那么dp[i][j]=min  dp[i ...

  3. 【基础操作】博弈论 / SG 函数详解

    博弈死我了……(话说哪个小学生会玩博弈论提到的这类弱智游戏,还取石子) 先推荐两个文章链接:浅谈算法——博弈论(从零开始的博弈论) 博弈论相关知识及其应用 This article was updat ...

  4. POJ2425 A Chess Game[博弈论 SG函数]

    A Chess Game Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 3917   Accepted: 1596 Desc ...

  5. JZYZOJ1540 BZOJ4035 [ haoi2015 上午] T3 博弈论 sg函数 分块 haoi

    http://172.20.6.3/Problem_Show.asp?id=1540 之前莫比乌斯反演也写了一道这种找规律分块计算的题,没觉得这么恶心啊. 具体解释看代码. 翻硬币的具体方法就是分别算 ...

  6. POJ 2960 S-Nim 博弈论 sg函数

    http://poj.org/problem?id=2960 sg函数几乎是模板题. 调试代码的最大障碍仍然是手残在循环里打错变量名,是时候换个hydra产的机械臂了[超想要.jpg] #includ ...

  7. POJ 2425 A Chess Game 博弈论 sg函数

    http://poj.org/problem?id=2425 典型的sg函数,建图搜sg函数预处理之后直接求每次游戏的异或和.仍然是因为看不懂题目卡了好久. 这道题大概有两个坑, 1.是搜索的时候vi ...

  8. eduCF#61 F. Clear the String /// 区间DP 消除连续一段相同字符 全部消完的最少次数

    题目大意: 给定字符串 每次消除可消除连续的一段相同的字符的子串 求消除整个字符串的最少消除次数 #include <bits/stdc++.h> using namespace std; ...

  9. UVa 1378 A Funny Stone Game [博弈论 SG函数]

    A Funny Stone Game 题意: $n \le 23$堆石子,每次选择$i < j \le k$,从$i$拿走1颗$j,k$各放入一颗,不能取就失败.求先手是否必胜以及第一次取的策略 ...

随机推荐

  1. 微前端(qiankun)主应用共享React组件

    前言 最近需要重构一个老项目,定的方案用微前端去改造.主应用是老的项目,微应用是新的项目,由于重构时间比较紧张,子应用还需要使用父应用的一些组件.过程中遇到一些问题,记录一下. 方案 我们知道qian ...

  2. DYOJ 【20220303模拟赛】最少分组 题解

    最少分组 题意 \(n\) 个点 \(m\) 条边的无向图,可以删掉 0 条或多条边,求满足条件的最小连通块数量: 对每个顶点对 \((a,b)\) ,若 \(a\) 和 \(b\) 同属于一个连通块 ...

  3. 阿里云FTP服务配置

    阿里云的CENTOS 7.4 并没有开启防火墙服务 所以好多人配置了FTP后会出现各种不能访问的问题 关键原因在于端口没有开放.设置端口阿里云ECS的管理控制台中"安全组" &qu ...

  4. java中的方法重载(overload)

    什么时候方法重载:当两个方法的功能是相似的,可以考虑使用方法重载.若两个方法根本没有关系,无必要使用方法重载. 什么时候代码会发生方法重载:三个条件:1,在同一个类中.2,方法名相同.3,参数列表相同 ...

  5. node图片压缩的两员大将

    一.ishrink 全局安装 npm i ishrink -g 1.按url方式压缩 本地图片地址 sk -u C:\Users\admin\Desktop\images\img 网络图片地址 sk ...

  6. 获取请求体数据 POST

    POST获取请求体 请求体中封装了 POST请求的请求参数 获取流对象 再从流对象中那数据 一种字节流 一种字符流 BufferedReader getReader()获取字符输入流 只能操作字符 S ...

  7. RPA应用场景-财务报表统计整合

    场景概述 财务报表统计整合 所涉系统名称 邮储银行系统 人工操作(时间/次) 3小时 所涉人工数量 1 操作频率 每月 场景流程 1.登录各个区支行系统 2.机器人按照要求,自动复选多项业务参数,导出 ...

  8. NC14893 栈和排序

    NC14893 栈和排序 题目 题目描述 给你一个1->n的排列和一个栈,入栈顺序给定 你要在不打乱入栈顺序的情况下,对数组进行从大到小排序 当无法完全排序时,请输出字典序最大的出栈序列 输入描 ...

  9. 自己动手实现 HashMap(Python字典),彻底系统的学习哈希表(上篇)——不看血亏!!!

    HashMap(Python字典)设计原理与实现(上篇)--哈希表的原理 在此前的四篇长文当中我们已经实现了我们自己的ArrayList和LinkedList,并且分析了ArrayList和Linke ...

  10. web 前端 基础HTML知识点

    web系统架构体系 B/S(Browser/Server):浏览器实现 优点: 规范.使用方便.本身实现成本低 容易升级.便于维护 缺点: 没有网络,无法使用 保存数据量有限,和服务器交互频率高.耗费 ...