- P206's solution
-
P206's Solution
- @ 2026-1-5 0:34:33
我们在下文中沿用以下记号:
下文将「先手获胜当且仅当 」称为「论断 」。
除特殊说明外,后面的情况中不考虑前面的情况。
情况 1
,后手获胜。
情况 2
,此时只能靠条件 1 取胜,适用论断 。
情况 3
,此时只能靠条件 1 取胜,适用论断 。
情况 4
,根据上面的论断可知 ,此时先手对最小值操作即可获胜。
情况 5
且 ,根据上面的论断可知 ,此时后手和先手做一样的操作即可获胜。
情况 6
考虑某个 且「论断 」声称先手获胜的中间局面(特别地,此时考虑情况 2):
- 如果先手能对最小值操作,则获胜。
- 否则一定有 ,于是 ,适用论断 :先手获胜。
继续考虑某个 且论断 声称「先手获胜」的中间局面,
- 根据上面的论断可知 和 不同时成立。
- 于是先手对最大值操作,依然有 。
- 如果后手接下来的操作使得 ,则根据上面的论断可知先手获胜。
- 否则仍然有 (一次操作中 变化量的绝对值不会超过 ),回到了此局面。
综上所述,本情况适用论断 ,并且没有「情况 7」了。
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n, k, x, s = 0, c1 = 0, c2 = 1000000000;
while (cin >> n >> k)
{
s = 0;
c1 = 0;
c2 = 1000000000;
for (int i = 1; i <= n; i++)
{
cin >> x;
s += x;
c1 = max(c1, x);
c2 = min(c2, x);
}
if (c1 - c2 >= k)
{
puts("No");
continue;
}
if (c1 - c2 == k - 1 && c2 && n != 1)
{
puts("Yes");
continue;
}
if (c1 == c2 && c2 >= 2 && k == 2 && n != 1)
{
puts("No");
continue;
}
if (s % 2)
{
puts("Yes");
continue;
}
puts("No");
}
return 0;
}