题解:CF2049C MEX Cycle

做过最有意思的构造题。

假设没有 xxyy 影响思维,这道题就变得比较好做。

  • 偶数,则以 n=6n = 6 为例,可以构造如下:
0 1 0 1 0 1

容易发现是 0,1,0,10,1,0,1\dots 如此循环

  • 奇数类似,循环后加一个 22,刚好满足,以 n=7n = 7 为例:
0 1 0 1 0 1 2

难点在于 x,yx,y,但不用慌,找一下规律。

奇数

  • 如果 axa_xaya_y 目前都是 0011,并且 xxnn 相邻(yy 也可以,下文同),即为 11n1n - 1,交换 axa_xana_n 即可。
  • 否则 axa_x 设为 22

偶数

类似,但由于没有元素 22,无需判断,只要 axa_xaya_y 目前都是 0011,就将 axa_x 设为 22

上述东西都很好理解,拿出草稿纸举个例子就能明白。

给出代码:

#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;
}

posted on   zhangzirui66  阅读(6)  评论(0编辑  收藏  举报  

相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示