专栏文章

题解:P11969 「ALFR Round 7」T2 Game

P11969题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@miptpb5e
此快照首次捕获于
2025/12/03 17:47
3 个月前
此快照最后确认于
2025/12/03 17:47
3 个月前
查看原文
这道题使用博弈论,需要对 tt 的奇偶性进行分类讨论。

Part 1 思路

t=1t = 1 时,相当于只有先手一次操作机会。那么,想让字典序最小,只需要把 11 提到第一位即可。但要是 11 已经在第一位了,那我们就把 22 提到第一位,以此类推。形式化的,我们找到第一个 aiia_i \ne i,将 ii 放到第 ii 个位置即可。
我们推广一下,当 tt 为奇数且 t>1t > 1 时,第 22 次操作后手只能将 11 挪作(目的是维持现状,否则先手就会把 22 再放到第二个位置上,更加不利),先手再把 11 挪回来,以此反复。所以,当 tt 为奇数时,情况和 t=1t = 1 是一样的。
再来考虑 t=2t = 2 时的情况。此时先手后手各操作一次。先从后手开始考虑,后手肯定会把 nn 放到第一位,让字典序最大。先手此时不可能将第一位更改成小于 nn 的数,所以退而求其次,将第二位降低,越小越好。所以,先手会把 11 放到第二位。但是,如果 11 已经在第二位,那么我们不妨把 22 放到第三位,以此类推。形式化的,我们找到第一个 aii1a_i \ne i - 1 i2i \ge 2 的,将 i1i - 1 放到第 ii 位上。
接着推广一下,当 tt 是偶数且 t>2t > 2,第 33 次操作先手唯一的策略就是把现在在第一位上的 nn 移走(目的还是维持现状,因为如果不挪走 nn,那么后手就会将 n1n - 1 放到第二位上,更加不利),后手会再把 nn 放回来,以此类推。所以,当 tt 为偶数时,和 t=2t = 2 的情况是一样的。

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;
}
说明一下,代码中 pip_i 表示的是 iiaa 数组中的位置,这样查找方便。

Part 3 其他注意事项

我们考虑一种情况:若 tt 为偶数且 a1=na_1 = n,那么直接输出原数组。原因:先手只能把 nn 移走。假设先手没有移走 nn,后手就可以把 n1n - 1 移到第二个位置上,这样肯定不优于原数组,所以先手只能把 nn 移走,后手再放回来,陷入死循环,所以直接输出原数组。
另外一种情况:若 tt 为偶数且 a1=1a_1 = 1a2=na_2 = n,先手只需要将 22 移到第三位上,后手便会把 nn 放到第一位上,11 也就到了第二位上,符合先手的需求。形式化的,我们只需要找到第一个 aii1a_i \ne i - 1i3i \ge 3,将 i1i - 1 移到第 ii 位上,交换第一位第二位即可。

评论

1 条评论,欢迎与作者交流。

正在加载评论...