AGC002E题解

简要题意

桌上有 n 堆糖果,第 i 堆糖果有 ai 个糖。两人在玩游戏,轮流进行,每次进行下列两个操作中的一个:

  1. 将当前最大的那堆糖果全部吃完;

  2. 将每堆糖果吃掉一个;

吃完的人输,假设两人足够聪明,问谁有必胜策略?

数据范围1n105,1ai109

思路

首先对于最大的一堆糖,如果两个人不去操作它那么他就会一直是最大的,而如果有人选择干掉它,那么剩下的最大值会顶替它。所以我们首先可以将 ai 从大到小排序。但是对于第二种操作每次我们都要将全局减一不方便,但是每个数的相对大小不变,所以我们可以看成有一条线去截一些数,每次向上挪动。同样的,对于第一种操作我们也可以用相同的方法表示。所以我们可以将数列下标与数值看成一个有序二元组,由它们组成边界,把题目转化成在平面直角坐标系中有一个在 (1,1) 的石子,现在两个人轮流移动,不能移动者获胜。于是就可以递推出每个格子的情况,但是数据范围不允许我们算出全部格子,所以需要稍微找一下规律。我们发现对角线上的格子的情况是一样的,所以可以暴力找到最远的对角线上的点,然后看它的上面与右边的获胜情况推出它自己是否获胜。

代码

bool cmp(int a, int b){return a > b;}

signed main(){
    n = rd();
    for(int i = 1; i <= n; ++i)a[i] = rd();
    sort(a + 1, a + 1 + n, cmp); int pos;
    for(pos = 1; pos <= n and a[pos] >= pos; ++pos); --pos;
    bool o = (a[pos] - pos) & 1;
    if(! o){
        int i; for(i = pos + 1; a[i] == pos; ++i); --i;
        o = (i - pos) & 1;
    }
    puts(o ? "First" : "Second");
    return 0;
}
posted @   Lyrella  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示