AGC 002E.Candy Piles(博弈论)
\(Description\)
给定\(n\)堆糖,数量分别为\(a_i\)。Alice和Bob轮流操作。每次可以吃掉最多的一堆,也可以每堆各吃掉一个。无法操作的人输,求谁能赢。
\(n\leq10^5,\ a_i\leq10^9\)。
\(Solution\)

画这图累死了= = 虽然确实有点丑
假设有\(5\)堆糖,把它画成这样。我们发现每次操作就是拿掉最左边一列或最下边的一行。那么可以看成,初始在\((1,1)\),每次向右或向上走一步。
考虑求\(SG\)。边界位置的\(SG\)值显然为\(0\),且\(SG\)只有\(01\)两种取值表示胜负。其余位置的\(SG\)都可以求出,但是复杂度会炸。
打表可以发现,除去最边上一层,同一条副对角线上的位置的\(SG\)值是相同的,即\(sg(x,y)=sg(x+1,y+1)\)。
考虑若\(sg(x+1,y+1)=1\),\((x,y)\)的后继的后继会有\((x+1,y+1)\)这一必胜态,所以\(sg(x,y)=1\);若\(sg(x+1,y+1)=0\),则\((x,y)\)的后继存在必败态的后继,所以\(sg(x,y)=0\)。
然后我们就可以找第一个满足\(i+1>A_{i+1}\)的位置\((i,i)\),求\((i,i)\)的\(SG\)值,即右边上边各有多少个位置有糖即可。
这个结论是很常用的结论:同一条对角线上的\(SG\)值相同。
//8ms 896KB
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <functional>
#define gc() getchar()
#define MAXIN 300000
//#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e5+5;
int A[N];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
int main()
{
const int n=read();
for(int i=1; i<=n; ++i) A[i]=read();
std::sort(A+1,A+1+n,std::greater<int>());
for(int i=1; i<=n; ++i)
if(i+1>A[i+1])
{
int ans=0;
for(int j=i+1; A[j]==i; ++j) ans^=1;
ans|=A[i]-i&1;
puts(ans?"First":"Second");
return 0;
}
return 0;
}
AGC 002E.Candy Piles(博弈论)的更多相关文章
- agc002E - Candy Piles(博弈论)
题意 题目链接 Sol Orz SovitPower #include<bits/stdc++.h> #define Pair pair<int, double> #defin ...
- 【AGC002E】Candy Piles 博弈论
题目大意 有\(n\)堆糖果,第\(i\)堆有\(a_i\)个. 两个人轮流决策,决策分为两种: 1.选择糖果数最多的一堆糖果,并把这堆糖全吃了. 2.在每堆非空的糖果堆里拿一颗糖吃掉. 吃掉最后一颗 ...
- [atcoder002E] Candy Piles [博弈论]
题面: 传送门 思路: 每一堆糖排成一列,所有列横着放,形成一个阶梯型 两个决策相当于左边一列去掉和最下面一行去掉 那么这个模型可以转化为同样形状的网格图,向左上方走,走到边界的赢· 然后一波数学推导 ...
- AtCoder AGC002E Candy Piles (博弈论)
神仙题..表示自己智商不够想不到... 好几次读成最后拿的赢了,导致一直没看懂题解... 题目链接: https://atcoder.jp/contests/agc002/tasks/agc002_e ...
- [Agc002E/At1999] Candy Piles - 博弈论
有n堆石子,第i堆有ai个石子.有两种操作: 把石子最多的那一堆给丢掉 把每一堆全部丢掉一个 谁拿走最后石子谁输.判断胜负情况. 直觉转化为一个走棋盘问题 考虑如何计算左下角点的状态 找到原点最右上方 ...
- [Agc002E]Candy Piles
[Agc002E]Candy Piles 题目大意 有\(n\)个数,两人轮流操作,可以做以下操作之一: 删掉一个最大的数 将所有数-1 最后取没的人输,问先手是否必胜? 试题分析 直接决策不知道选哪 ...
- AtCoder - 1999 Candy Piles
Problem Statement There are N piles of candies on the table. The piles are numbered 1 through N. At ...
- 【AGC002 E】Candy Piles
本来实在写不动这题 sol 了,但一想这是个经典的模型转化问题,于是就写了(.jpg) 题意 有一个序列 \(a_i\). 两人轮流操作,每次操作为二选一: 1. 把最大的 \(a_i\) 减成 \( ...
- [AT1999] [agc002_e] Candy Piles
题目链接 AtCoder:https://agc002.contest.atcoder.jp/tasks/agc002_e 洛谷:https://www.luogu.org/problemnew/sh ...
随机推荐
- django----多对多数据添加
class UserInfo(models.Model): """ 用户表:既有班主任也有老师 """ username = models. ...
- Python-数据类型之数字
一:数字类型概述 数字提供了标量存储和直接访问,属于不可变数据类型,所谓不可变,我们可以认为,更改数字的值会生成一个新的对象 # id可以唯一表示一个对象 age =18 print(id(age)) ...
- 20165206 2017-2018-2《Java程序设计》课程总结
20165206 2017-2018-2<Java程序设计>课程总结 一.每周作业链接汇总 预备作业1:对师生关系的看法和期望 预备作业2:c语言基础和学习技能的理解 预备作业3:Linu ...
- GZipStream 压缩与解压数据
简介:此类表示 GZip 数据格式,它使用无损压缩和解压缩文件的行业标准算法.这种格式包括一个检测数据损坏的循环冗余校验值.GZip 数据格式使用的算法与 DeflateStream 类的算法相同,但 ...
- [SDOI2018]原题识别
题解: ..感觉挺烦得 而且我都没有注意到树随机这件事情.. 就写个30分的莫队.. #include <bits/stdc++.h> using namespace std; #defi ...
- 易企秀H5 json配置文件解密分析
最近需要参考下易企秀H5的json配置文件,发现已经做了加密,其实前端的加密分析起来只是麻烦点. 抓包分析 先看一个H5: https://h5.eqxiu.com/s/XvEn30op F12可以看 ...
- Newtonsoft.Json 高级用法
基本用法 Json.NET是支持序列化和反序列化DataTable,DataSet,Entity Framework和Entity的.下面分别举例说明序列化和反序列化. DataTable: //序列 ...
- Vue axios 返回数据绑定到vue对象问题
在项目中需要用到后台的数据对前端渲染,使用到了vue整合的axios,使用vue中的钩子函数在页面组件挂载完成之后向后台发送一个get请求然后将返回后的数据赋值data()中定义的属性: 执行后前端报 ...
- nethogs命令执行报异常的解决方法
- net core体系-Xamarin-1概要
大家在开发领域都知道Java是跨平台的,但是很多人认为.NET是只能在Windows下运行,不具有跨平台的特性,这种说法其实是不妥的. .NET其实在设计之初也是考虑像Java一样跨平台的,我们知道. ...