Solution - Atcoder Atcoder ARC137C Distinct Numbers

rizynvu發表於2024-11-01

如果嘗試去刻畫這個問題,會發現非常複雜,於是不妨一步一步來。

考慮 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;
}

相關文章