A.

通过排序,一个正序一个倒序。

B.

先考虑偶数的情况,如果对称的位置不同,可以算出来最小的操作次数,最多的操作次数显然是 n-ans,然后奇偶性相同的都是合法的。

然后奇数,考虑中间的位置,可以随意更改,此时就没有奇偶性的限制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void solve() {
int n;
cin >> n;
string s;
cin >> s;
int i = 0;
int j = n - 1;
int ans = 0;
while (i < j) {
if (s[i] != s[j]) {
ans += 1;
}
i++;
j--;
}
for (int i = 0; i <= n; i++) {
if (i <= n - ans && i >= ans && ((i - ans) % 2 == 0 || n % 2 == 1)) {
cout << 1;
} else {
cout << 0;
}
}
cout << "\n";
}

C.

手玩一下就是你最多填上一个数字,别的都重复他的操作即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void solve() {
int n;
cin >> n;
vi a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int l = 0;
while (l < n && a[l] == l) {
l += 1;
}
while (true) {
cout << l << endl;
int y;
cin >> y;
l = y;
if (y == -1) {
break;
}
}
}

D.

手玩一下发现,每个部分必定要有一个大小为 $k$ 的环,别的随意。

E.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void solve() {
int n;
cin >> n;
int k;
cin >> k;
int i = 0;
int ans = 0;
while (i < n) {
if (i % k == n % k) {
ans ^= ask(i);
i += k;
} else {
int r = n % k;
ans ^= ask(i);
ans ^= ask(i + r / 2);
ans ^= ask(i + r);
i += k + r;
}
}
cout << "! " << ans << endl;
}