题解:CF2049C MEX Cycle
做过最有意思的构造题。
假设没有 和 影响思维,这道题就变得比较好做。
- 偶数,则以 为例,可以构造如下:
0 1 0 1 0 1
容易发现是 如此循环
- 奇数类似,循环后加一个 ,刚好满足,以 为例:
0 1 0 1 0 1 2
难点在于 ,但不用慌,找一下规律。
奇数
- 如果 和 目前都是 或 ,并且 与 相邻( 也可以,下文同),即为 或 ,交换 和 即可。
- 否则 设为 。
偶数
类似,但由于没有元素 ,无需判断,只要 和 目前都是 或 ,就将 设为 。
上述东西都很好理解,拿出草稿纸举个例子就能明白。
给出代码:
#include<bits/stdc++.h>
using namespace std;
int t, n, x, y, a[200005];
int main(){
cin >> t;
while(t --){
cin >> n >> x >> y;
if(n & 1){
for(int i = 2; i <= n; i += 2) a[i - 1] = 0, a[i] = 1; a[n] = 2;
if(a[x] == 0 && a[y] == 0){
if(x == n - 1 || x == 1) swap(a[x], a[n]);
else a[x] = 2;
}
if(a[x] == 1 && a[y] == 1){
if(x == n - 1 || x == 1) swap(a[x], a[n]);
else a[x] = 2;
}
}
else{
for(int i = 1; i <= n; i += 2) a[i] = 0, a[i + 1] = 1;
if(a[x] == 0 && a[y] == 0){
a[x] = 2;
}
if(a[x] == 1 && a[y] == 1){
a[x] = 2;
}
}
for(int i = 1; i <= n; i ++) cout << a[i] << " ";
cout << "\n";
}
return 0;
}

浙公网安备 33010602011771号