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 ...
随机推荐
- 小学生都看得懂的C语言入门(2): 判别 循环的一些应用实例
1.bool 类型 定义bool类型之前需要导入#include <stdbool.h> #include <stdio.h> #include <stdbool.h&g ...
- [Gym-102091E] How Many Groups
/* 先将a数组从小到大排序 dp[i][j][k]表示到以第i个数为结尾的,且第i个数改了j次,第i个数改动值为k-1的集合最大值 ans是dp过程中的最大集合大小 状态转移: 首先是到i改动为0次 ...
- Allegro PCB Design GXL (legacy) 使用slide推挤走线,走线的宽度就发生改变的原因
Allegro PCB Design GXL (legacy) version 16.6-2015 使用slide推挤走线,走线的宽度就会发生改变. 后来发现是因为约束管理器(Constraint M ...
- vue项目使用阿里巴巴矢量图标库教程
前言:element-ui自带的图标库还是不够全,还是需要需要引入第三方icon,自己在用的时候一直有些问题,参考了些教程,详细地记录补充下. 对于我们来说,首选的当然是阿里icon库 地址:http ...
- python提取文件中的方法名称
#提取文件中的方法名称 # -*- coding:utf-8 -*- def Query_Method(filepath): file = open(filepath,'r',encoding= 'U ...
- Android 中的缓存
AsimpleCache 1.它可以缓存什么东西? 普通的字符串. json. 序列化的java对象 字节数字. 2.主要特色 1:轻,轻到只有一个JAVA文件. 2:可配置,可以配置缓存路径,缓存 ...
- 关于 java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.String
今天遇到了这个异常,其实是自己经验欠缺所致.我是通过mybatis查询到数据库传过来的主键,是一个32位的char类型. 代码: //查询总账表的该组织总账记录,包括该条记录的主键id.账户余额Dzz ...
- C#学习-类的成员
定义完类之后,还需在类中定义成员. 类的成员包括字段.属性.方法和构造函数等,它们与类一样,也都有自己的访问权限.以下是 public,同一个程序集或引用该程序集的其他程序集都可以访问 private ...
- c++ char数组形式的字符串 与输入输出
1. c风格字符串,和strlen函数 #include "stdafx.h" #include <iostream> using std::cout; using s ...
- Fstring
题目描述 一个只包含A,B,C三种字符的字符串,如果其中有连续的3个由A,B,C各一个组成,则称为Fstring. 例如:BAACAACCBAAA就是,而AABBCCAABB则不是. 你的任务就是计算 ...