一个思路题 画了好多 才看出来 有点菜 orz
AND Minimum Spanning Tree
题面
You are given a complete graph with N vertices, numbered from 1 to N.
The weight of the edge between vertex x and vertex y (1<=x, y<=N, x!=y) is simply the bitwise AND of x and y. Now you are to find minimum spanning tree of this graph.
给了你1 到 n 边权是 2点 & 的值
很快知道 只有 1 和 0 但是 一开始没有思考找最小 只是构造出来 wa了一发 然后脑子开始不转了 花了点时间 想到从低开始 遇到第一个二进制 0 与之前 的 100… 数据 看看能不能对其
如果没有0不然就向上找 + 1… 能不能再n以下 就过了
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e6 + 5;
int main() {
int t, n;
scanf("%d", &t);
while(t -- ) {
scanf("%d", &n);
int ejws = 0;
int m = n;
while(m) {
ejws ++;
m/=2;
}
int q1s = 0;
q1s = (1 << ejws) - 1;
int ans = 0;
if(n == q1s) ans = 1;
printf("%d\n", ans);
for(int i = 2; i <= n; i ++) {
int ejws = 0;
int m = i;
int f = 0;
while(m) {
if(m % 2 == 0) {
printf("%d", 1 << ejws);
f = 1;
break;
}
m /= 2;
ejws ++;
}
if(!f) {
;if(i + 1 <= n) printf("%d", i + 1);
else printf("%d", 1);
}
if(i == n) puts("");
else printf(" ");
}
}
return 0;
}