专栏文章
题解:P11969 「ALFR Round 7」T2 Game
P11969题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @miptpb5e
- 此快照首次捕获于
- 2025/12/03 17:47 3 个月前
- 此快照最后确认于
- 2025/12/03 17:47 3 个月前
这道题使用博弈论,需要对 的奇偶性进行分类讨论。
Part 1 思路
当 时,相当于只有先手一次操作机会。那么,想让字典序最小,只需要把 提到第一位即可。但要是 已经在第一位了,那我们就把 提到第一位,以此类推。形式化的,我们找到第一个 ,将 放到第 个位置即可。
我们推广一下,当 为奇数且 时,第 次操作后手只能将 挪作(目的是维持现状,否则先手就会把 再放到第二个位置上,更加不利),先手再把 挪回来,以此反复。所以,当 为奇数时,情况和 是一样的。
再来考虑 时的情况。此时先手后手各操作一次。先从后手开始考虑,后手肯定会把 放到第一位,让字典序最大。先手此时不可能将第一位更改成小于 的数,所以退而求其次,将第二位降低,越小越好。所以,先手会把 放到第二位。但是,如果 已经在第二位,那么我们不妨把 放到第三位,以此类推。形式化的,我们找到第一个 且 的,将 放到第 位上。
接着推广一下,当 是偶数且 ,第 次操作先手唯一的策略就是把现在在第一位上的 移走(目的还是维持现状,因为如果不挪走 ,那么后手就会将 放到第二位上,更加不利),后手会再把 放回来,以此类推。所以,当 为偶数时,和 的情况是一样的。
我们推广一下,当 为奇数且 时,第 次操作后手只能将 挪作(目的是维持现状,否则先手就会把 再放到第二个位置上,更加不利),先手再把 挪回来,以此反复。所以,当 为奇数时,情况和 是一样的。
再来考虑 时的情况。此时先手后手各操作一次。先从后手开始考虑,后手肯定会把 放到第一位,让字典序最大。先手此时不可能将第一位更改成小于 的数,所以退而求其次,将第二位降低,越小越好。所以,先手会把 放到第二位。但是,如果 已经在第二位,那么我们不妨把 放到第三位,以此类推。形式化的,我们找到第一个 且 的,将 放到第 位上。
接着推广一下,当 是偶数且 ,第 次操作先手唯一的策略就是把现在在第一位上的 移走(目的还是维持现状,因为如果不挪走 ,那么后手就会将 放到第二位上,更加不利),后手会再把 放回来,以此类推。所以,当 为偶数时,和 的情况是一样的。
Part 2 代码
CPP#include <bits/stdc++.h>
using namespace std;
#define int long long
const int M = 1e5 + 10;
int n, t, a[M], p[M];
signed main() {
cin >> t >> n;
for (int i = 1; i <= n; i ++) cin >> a[i], p[a[i]] = i;
if (t % 2 == 1) {
for (int i = 1; i <= n; i ++) {
if (i != a[i]) {
int pos = p[i];
swap(a[i], a[pos]);
break ;
}
}
}
if (t % 2 == 0) {
if (a[1] == n) {
for (int i = 1; i <= n; i ++) cout << a[i] << " ";
return 0;
}
if (a[1] == 1 && a[2] == n) {
for (int i = 3; i <= n; i ++) {
if (a[i] != a[i - 1]) {
int pos = p[i - 1];
swap(a[i], a[pos]);
break ;
}
}
swap(a[1], a[2]);
for (int i = 1; i <= n; i ++) cout << a[i] << " ";
return 0;
}
for (int i = 2; i <= n; i ++) {
if (a[i] != i - 1) {
int pos = p[i - 1];
swap(a[pos], a[i]);
break ;
}
}
swap(a[1], a[p[n]]);
}
for (int i = 1; i <= n; i ++) cout << a[i] << " ";
cout << "\n";
return 0;
}
说明一下,代码中 表示的是 在 数组中的位置,这样查找方便。
Part 3 其他注意事项
我们考虑一种情况:若 为偶数且 ,那么直接输出原数组。原因:先手只能把 移走。假设先手没有移走 ,后手就可以把 移到第二个位置上,这样肯定不优于原数组,所以先手只能把 移走,后手再放回来,陷入死循环,所以直接输出原数组。
另外一种情况:若 为偶数且 且 ,先手只需要将 移到第三位上,后手便会把 放到第一位上, 也就到了第二位上,符合先手的需求。形式化的,我们只需要找到第一个 且 ,将 移到第 位上,交换第一位第二位即可。
另外一种情况:若 为偶数且 且 ,先手只需要将 移到第三位上,后手便会把 放到第一位上, 也就到了第二位上,符合先手的需求。形式化的,我们只需要找到第一个 且 ,将 移到第 位上,交换第一位第二位即可。
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...