如果嘗試去刻畫這個問題,會發現非常複雜,於是不妨一步一步來。
考慮 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;
}