首页 > 其他分享 >Solution - Atcoder Atcoder ARC137C Distinct Numbers

Solution - Atcoder Atcoder ARC137C Distinct Numbers

时间:2024-11-01 18:41:31浏览次数:3  
标签:Atcoder Distinct Solution Alice 必胜 int Bob mathrm

如果尝试去刻画这个问题,会发现非常复杂,于是不妨一步一步来。

考虑 Alice 的第一步,此时 Alice 操作的位置是固定的。
考虑把 \(a_n\) 移到一个位置后,接下来的 \(\max\) 是 \(a_{n - 1}\) 或 \(a_n\),Bob 对应也只能这么操作。

注意到 Bob 也有可能操作的是 \(a_n\),这看起来就很特殊。
发现 Bob 把这个 \(a_n\) 无论移到哪了实际上 Alice 都能在第一步就移到这个位置。

刻画一下,相当于是对于决策转移 \(\mathrm{S}\to \mathrm{T}\),满足 \(\forall \mathrm{T}\to \mathrm{P}\) 都有 \(\mathrm{S}\to \mathrm{P}\)。
能够发现 \(\mathrm{S}\) 是必胜的,证明考虑分类讨论:

  • \(\forall \mathrm{T}\to \mathrm{P}\),\(\mathrm{P}\) 都必胜,那么 \(\mathrm{T}\) 必输,\(\mathrm{S}\) 就必胜。
  • \(\exists \mathrm{T}\to \mathrm{P}\),\(\mathrm{P}\) 必输,那么 \(\mathrm{S}\) 必胜。

于是只要 Alice 能够使第一步后 \(a_n > a_{n - 1}\),即让 Bob 还是操作 \(a_n\),那么 Alice 必赢。
所以说可以知道若 \(a_n - 1 > a_{n - 1}\),Alice 必胜。

否则根据上面的决策的讨论,可以知道为了不让对方赢,肯定每一步都会让最大的两个值相邻。
那么每次决策后 \(\max\{a_i\}\) 必定会 \(-1\)(最大的往下,次大的为最大的 \(-1\),变为新的最大的)。
那么到最后 \(\max\{a_i\} = n - 1\) 时就无法再操作了,操作轮数 \(\max\{a_i\} - (n - 1)\),如果为奇数那么 Alice 就肯定赢了。

时间复杂度 \(\mathcal{O}(n)\)。

#include<bits/stdc++.h>
const int maxn = 3e5 + 10;
int main() {
   int n, x, y;
   scanf("%d", &n);
   for (int i = 1; i <= n; i++) {
      x = y, scanf("%d", &y);
   }
   puts((x + 1 < y || (y - (n - 1)) % 2 == 1) ? "Alice" : "Bob");
   return 0;
}

标签:Atcoder,Distinct,Solution,Alice,必胜,int,Bob,mathrm
From: https://www.cnblogs.com/rizynvu/p/18521032

相关文章

  • TOYOTA SYSTEMS Programming Contest 2024(AtCoder Beginner Contest 377) 补题记录(A-E
    AtCoderBeginnerContest377A-RearrangingABC字符串有ABC三个字母即可。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongsignedmain(){ strings; cin>>s; map<char,int>mp; for(autot:s){ mp[t]=1; } if(mp[......
  • AtCoder Beginner Contest 376 题解
    AtCoderBeginnerContest376题解AtCoderBeginnerContest376A-CandyButton#include<bits/stdc++.h>#defineendl'\n'usingnamespacestd;voidsolve(){ intn,c;cin>>n>>c; intpre=-1; intans=0; for(inti=1;i<=n;i++)......
  • dp专题总结 - AtCoder DP Contest
    dp专题总结题单:this w......
  • Atcoder DP Contest
    好像都在说这套题很好,所以来刷一遍太水的就只放代码了尚未完工,先发一下猫猫可爱捏https://www.tldraw.com/ro/1g8hQBpWTkduIlFxT3c0P?d=v-1275.1523.960.968.pageA.Frog1#include<bits/stdc++.h>usingnamespacestd;intn;inth[100001];intf[100001];intmain(){ ......
  • AtCoder Beginner Contest 366 - VP记录
    A-Election2高桥日常出镜,kkk好好学学。点击查看代码#include<cstdio>usingnamespacestd;intmain(){ intn,t,a; scanf("%d%d%d",&n,&t,&a); if(t>n-t||a>n-a)printf("Yes\n"); elseprintf("No\n"); return0;......
  • AtCoder Beginner Contest 377
    上周六咕咕咕了省流版A.排序判断即可B.枚举判断即可C.记录覆盖位置去重,总数-覆盖数即可D.枚举右端点,考虑符合条件的左端点数量即可E.考虑排列的\(i\top_i\)图,考虑操作数与走的边数关系,利用环循环节算偏移量即可F.考虑每个皇后实际覆盖的位置,枚举先前皇后计算覆......
  • 【Atcoder训练记录】AtCoder Beginner Contest 377
    训练情况赛后反思D题差一点点吧?可能不去乐跑就能写出来了A题我们发现ABC是字典序单调递增的,字符串先排序再判断是否为ABC即可。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;voidsolve(){ strings;cin>>s; sort(s.begin(),s.end()); i......
  • AtCoder Regular Contest 185 题解
    A-modMGame2第一个观察是如果一个人手中还有2张牌,那么他一定不会被秒。这可以推出决定胜负的时刻一定是Alice和Bob手中只剩一张牌的时候,此时如果Alice被秒了,那么她就似了,否则她就赢了。考虑Alice什么时候能被秒。记决定胜负的时刻Alice手中的牌是\(a\),Bob手......
  • AtCoder Snuke21 J. Drink Bar 部分分题解
    这里将每一个三元组\((a_i,b_i,c_i)\)称为一组数。Subtask1暴力枚举所有的非空子集即可。枚举方式可以采用类似状压DP的二进制枚举或者直接DFS。时间复杂度\(O(N\times2^N)\)。Subtask2性质:此时的特征值最多由两个有效组组成,原因可见Subtask3。因为\(a_i=......
  • AtCoder Beginner Contest 375 C题 (python解)
    PanasonicProgrammingContest2024(AtCoderBeginnerContest375)C-SpiralRotation(python解)**原题链接:[(https://atcoder.jp/contests/abc375/tasks/abc375_c)]题目简述:这道题要求对一个NxN的网格进行特定的螺旋旋转操作,而这个N总是偶数。在这里,网格中的每个单元......