传送门
题意:给定nnn,构造或判断无法构造一个2n2n2n个结点的树,其中结点iii和i+ni+ni+n的权值为iii,且所有iii和i+ni+ni+n路径权值异或和等于iii。
注意到 2i⊕2i+1=12i\oplus2i+1=12i⊕2i+1=1,然后可以脑补出
然而111没处理 发现1⊕2⊕3=01\oplus2\oplus3=01⊕2⊕3=0,可以用样例中的方法排出1→2→3→n+1→n+2→n+31\to2\to3\to n+1\to n+2\to n+31→2→3→n+1→n+2→n+3,后面按上面的方法构造
如果nnn为偶数最后会剩下一个nnn和2n2n2n
考虑找到x,yx,yx,y使x⊕y⊕1=nx\oplus y \oplus 1=nx⊕y⊕1=n,然后连接(n,x)(2n,y)(n,x)(2n,y)(n,x)(2n,y)
但是333没有接在111上,所以不能选
所以x,yx,yx,y需要满足1<x<n1<x<n1<x<n且x≠3x\neq3x=3,yyy一样
下面讨论什么条件下可以找到这样的x,yx,yx,y:(注意nnn是偶数)
当nnn是222的正整数次幂,显然是无解的
如果n=2k+2(k>2)n=2^k+2(k>2)n=2k+2(k>2),即x⊕y=2k+3x\oplus y=2^k+3x⊕y=2k+3,令x=2k+1,y=2x=2^k+1,y=2x=2k+1,y=2
否则直接把nnn的二进制最高位拆出来
即只有n=2kn=2^kn=2k是无解的
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;
int main()
{int n;scanf("%d",&n);if (!(n&(n-1))) return puts("No"),0;puts("Yes");printf("1 2\n2 3\n3 %d\n%d %d\n%d %d\n",n+1,n+1,n+2,n+2,n+3);for (int i=4;i<n;i+=2) printf("1 %d\n%d %d\n1 %d\n%d %d\n",i,i,i+1+n,i+1,i+1,i+n);if (!(n&1)){for (int i=2;i<=n;i++){int j=i^n^1;if (i!=3&&j!=3&&j<=n){printf("%d %d\n%d %d\n",i,n,j,2*n);break;}}}return 0;
}