AT5140 [AGC035C] Skolem XOR Tree

https://www.luogu.com.cn/problem/AT5140

奇妙的构造题

首先发现 2 i ⊕ 2 i + 1 = 1 2i \oplus 2i+1=1 2i2i+1=1
首先以 1 1 1为根
然后就 2 i − > 2 i + 1 + n , 2 i + 1 − > 2 i + n 2i->2i+1+n,2i+1->2i+n 2i>2i+1+n,2i+1>2i+n
然后把 1 + n 1+n 1+n随便接到一个叶子结点下面

如果还剩下一个,就用lowbit 瞎凑凑就好了

code:

#include<bits/stdc++.h>
#define lowbit(x) (x & -x)
using namespace std;
int n;
int main() {
    scanf("%d", &n);
    if(n == lowbit(n)) {
        printf("No");
        return 0;
    }
    printf("Yes\n");
    for(int i = 2; i < n; i += 2) {
        printf("%d %d\n", 1, i);
        printf("%d %d\n", 1, i + 1);
        printf("%d %d\n", i, i + n + 1);
        printf("%d %d\n", i + 1, i + n);
    }
    printf("%d %d\n", n + 1, n + 2);

    if(n % 2 == 0) {
        printf("%d %d\n", n, lowbit(n));
        printf("%d %d\n", n + n, n - lowbit(n) + 1);
    }
    return 0;
}
posted @ 2021-12-09 07:12  lahlah  阅读(38)  评论(0编辑  收藏  举报