\(\mathcal{Description}\)

  Link.

  有 \(n\) 堆石子,第 \(i\) 堆有 \(x_i\) 个,Alice 每次只能从这堆中拿走 \(a_i\) 个石子,Bob 每次只能从这堆中拿走 \(b_i\) 个石子,不能操作者负。对于 \(i=1,2,\dots,n\),求只考虑 \([1,i]\) 的石子堆时,双方博弈的结果(有 Alice 必胜、Bob 必胜、先手必胜、后手必胜四种结果)。

  \(n\le10^5\)。

\(\mathcal{Solution}\)

  我不会博弈啊……

  在这种非对称博弈问题中,一般不去研究 SG 函数,而是考虑“Alice 能比 Bob 多操作多少次”一类的问题。我们来逐步分析本题:

  结论:双方可以通过轮流操作同一堆石子,直至不存在这样石子堆,来达到最优策略。如果一方需要单独操作某一堆,另一方必然可以缠着(?)她,所以这个结论比较自然。

  所以只用考虑 \(r_i=x_i\bmod (a_i+b_i)\) 的取值

  • \(r_i<\min\{a_i,b_i\}\):双方无法操作,忽略;
  • \(\min\{a_i,b_i\}<r_i<\max\{a_i,b_i\}\):只有一方能操作,计入“能多操作几次”的贡献;
  • \(\max\{a_i,b_i\}\le r_i\):双方都能操作,但一方操作后另一方不能操作。

  先将所有第三类的操作记给 Alice,那么 Bob 选择一个 \(r_i\) 会使得 Alice 与 Bob 的操作次数差减少 \(\lfloor\frac{a_i}{r_i}\rfloor+\lfloor\frac{b_i}{r_i}\rfloor\),可见双方都会从大到小选择这一值,线段树维护选择结果即可。复杂度 \(\mathcal O(n\log n)\)。

\(\mathcal{Code}\)

/*~Rainybunny~*/

#include <cstdio>

#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) typedef long long LL; const int MAXN = 1e5;
int n, x[MAXN + 5], a[MAXN + 5], b[MAXN + 5]; struct SegmentTree {
static const int MAXND = 4e6;
int node, ch[MAXND][2], cnt[MAXND];
LL sum[MAXND][2]; inline void pushup( const int u ) {
cnt[u] = cnt[ch[u][0]] + cnt[ch[u][1]];
sum[u][0] = sum[ch[u][1]][0] + sum[ch[u][0]][cnt[ch[u][1]] & 1];
sum[u][1] = sum[ch[u][1]][1] + sum[ch[u][0]][!( cnt[ch[u][1]] & 1 )];
} inline void update( int& u, const int l, const int r, const int x ) {
if ( !u ) u = ++node;
if ( l == r ) {
++cnt[u];
sum[u][0] = ( cnt[u] + 1ll >> 1 ) * l;
sum[u][1] = 1ll * ( cnt[u] >> 1 ) * l;
return ;
}
int mid = l + r >> 1;
if ( x <= mid ) update( ch[u][0], l, mid, x );
else update( ch[u][1], mid + 1, r, x );
pushup( u );
}
} sgt; int main() {
freopen( "C.in", "r", stdin );
freopen( "C.out", "w", stdout ); scanf( "%d", &n );
rep ( i, 1, n ) scanf( "%d %d %d", &x[i], &a[i], &b[i] ); LL dif = 0; int rt = 0;
rep ( i, 1, n ) {
int r = x[i] % ( a[i] + b[i] );
if ( r >= a[i] && r >= b[i] ) {
dif += r / a[i], sgt.update( rt, 1, 2e9, r / a[i] + r / b[i] );
} else if ( r >= a[i] || r >= b[i] ) {
dif += ( r >= a[i] ? 1 : -1 ) * ( r / a[i] + r / b[i] );
} bool aw = dif - sgt.sum[rt][1] > 0, bw = dif - sgt.sum[rt][0] < 0;
if ( !aw && !bw ) puts( "Second" );
else if ( !aw ) puts( "Bob" );
else if ( !bw ) puts( "Alice" );
else puts( "First" );
}
return 0;
}

Solution -「多校联训」取石子游戏的更多相关文章

  1. Solution -「多校联训」I Love Random

    \(\mathcal{Description}\)   给定排列 \(\{p_n\}\),可以在其上进行若干次操作,每次选取 \([l,r]\),把其中所有元素变为原区间最小值,求能够得到的所有不同序 ...

  2. Solution -「多校联训」签到题

    \(\mathcal{Description}\)   Link.   给定二分图 \(G=(X\cup Y,E)\),求对于边的一个染色 \(f:E\rightarrow\{1,2,\dots,c\ ...

  3. Solution -「多校联训」Sample

    \(\mathcal{Description}\)   Link   (稍作简化:)对于变量 \(p_{1..n}\),满足 \(p_i\in[0,1],~\sum p_i=1\) 时,求 \(\ma ...

  4. Solution -「多校联训」光影交错

    \(\mathcal{Description}\)   Link.   一个游戏包含若干次卡牌抽取,每次以 \(p_l\) 的概率得到 \(+1\),\(p_d\) 的概率得到 \(-1\),否则得到 ...

  5. Solution -「多校联训」最小点覆盖

    \(\mathcal{Description}\)   Link.   求含有 \(n\) 个结点的所有有标号简单无向图中,最小点覆盖为 \(m\) 的图的数量的奇偶性.\(T\) 组数据.   \( ...

  6. Solution -「多校联训」战神归来

    \(\mathcal{Description}\)   Link.   一条地铁线路上共 \(m\) 个站点,\(n\) 个人乘坐地铁,第 \(i\) 个人需要从 \(s_i\) 站坐到 \(e_i\ ...

  7. Solution -「多校联训」博弈

    \(\mathcal{Description}\)   Link.   A B 两人在树上博弈,初始时有一枚棋子在结点 \(1\).由 A 先操作,两人轮流移动沿树上路径棋子,且满足本次移动的树上距离 ...

  8. Solution -「多校联训」小卖部

    \(\mathcal{Description}\)   Link.   有 \(n\) 种物品,第 \(i\) 中有 \(a_i\) 个,单价为 \(b_i\).共 \(q\) 次询问,每次查询用不超 ...

  9. Solution -「多校联训」排水系统

    \(\mathcal{Description}\)   Link.   在 NOIP 2020 A 的基础上,每条边赋权值 \(a_i\),随机恰好一条边断掉,第 \(i\) 条段的概率正比于 \(a ...

随机推荐

  1. ANT之macrodef

    macrodef 的意思是宏定义, 可以理解为自定义函数. 对于大型部署,可以提高代码利用率. 为了方便理解,请看代码示例: <macrodef name="macro-send-fi ...

  2. Python2 和 Python3 共存于 Centos7

    一.解决Python2 pip问题 centos7自带的是Python2,但是并没有安装pip,我们需要自行安装 包名为 python-pip # yum install epel-release - ...

  3. vue将HTML字符串解析为HTML标签

    如果返回的数据是html标签字符串的话,在vue里要通过v-html来渲染 <div v-html="rawHtml"></div> //v-html=&q ...

  4. 网络协议学习笔记(九)CDN和数据中心

    概述 上一篇给大家介绍了DNS协议和HttpDns协议,现在给大家介绍一下CDN和数据中心相关的知识. CDN:你去小卖部取过快递么? 如果你去电商网站下单买个东西,这个东西一定要从电商总部的中心仓库 ...

  5. 【分布式技术专题】「Zookeeper中间件」给大家学习一下Zookeeper的”开发伴侣”—Curator-Framework(基础篇)

    CuratorFramework基本介绍 CuratorFramework是Netflix公司开源的一套Zookeeper客户端框架,它作为一款优秀的ZooKeeper客户端开源工具,主要提供了对客户 ...

  6. JVM调优2-远程监控

    监控远程JVM VisualJVM不仅是可以监控本地jvm进程,还可以监控远程的jvm进程,需要借助于JMX技术实现. 什么是JMX JMX(Java Management Extensions,即J ...

  7. [开发笔记usbTOcan]软件需求分析和软件架构设计

    前面文章进行了系统分析和系统架构设计,手工焊接了一个板子,集合EK-TMC123GXL开发板(请忽略焊接技术) SWE.1 | 软件需求分析 软件需求分析过程的目的是将系统需求的软件相关部分转化为一组 ...

  8. MySQL的innoDB存储引擎的运作方式,数据结构等

    先上InnoDB架构图: 自上而下依次为内存区结构,后台线程,操作系统,磁盘存储,日志文件等. 其中内存由缓冲池,额外缓冲池,日志缓冲池组成.其中缓冲池中结构如下: 在磁盘存储文件中,MyISAM存储 ...

  9. javascript的AMD规法--esl与requirejs浅介。

    AMD规范,全称是Asynchronous Module Definition,即异步模块加载机制.从它的规范描述页面看,AMD很短也很简单,但它却完整描述了模块的定义,依赖关系,引用关系以及加载机制 ...

  10. C++基本面试题1

    #include<iostream>using namespace std;class A{public: A(char* s) :name(s), len(strlen(name.c_s ...