题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6614

题目大意是有一张n个点的完全图,n个点点权为1-n,边权为两点点权按位与(&)。求最小生成树的边权和以及每个点的父节点。

由于边权为点权相与,则每个点如果可以找到他二进制位下0的最小位所代表的十进制数则两点边权为0。

例如1010(10)的最小位0(即右数第二位)所代表的十进制数0010(2),则10与2相连。

特殊情况为1111(15)的最小位0(即右数第5位)所代表的的十进制数为10000(16),要判断此处16是否存在,如果不存在则选择0001(1)与之相连,边权为1。

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#define lson l, mid, i<<1
#define rson mid + 1, r, i<<1|1
using namespace std;
typedef long long ll;
const int maxn = 2e5 + ;
int fa[maxn];
int lowbit(int x) { return x & (-x); }
int qpow(ll a, ll b) {
ll ans = ;
while (b) {
if (b & )
ans = ans * a;
a = a * a;
b /= ;
}
return ans;
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
int n;
scanf("%d", &n);
int Max = qpow(, ) - , ans = ;
for (int i = ; i <= n; i++) {
if (i % ) {
if (lowbit(i) == i) continue;
int fat = lowbit((~i) &Max);
if (fat > n)fa[i] = , ans++;
else fa[i] = fat;
}
else
fa[i] = ;
}
printf("%d\n", ans);
for (int i = ; i <= n; i++)
printf("%d%c", fa[i], i == n ? '\n' : ' ');
}
}

最新文章

  1. C#怎样保证弹出窗体是唯一并居中显示
  2. php5.2.3连接sqlserver2008
  3. Dynamic Invok Webservice
  4. 【niubi-job——一个分布式的任务调度框架】----框架设计原理以及实现
  5. 1、C到C++安全性增强
  6. hdu-------1081To The Max
  7. Codeforces Round #122 (Div. 2)
  8. 李洪强漫谈iOS开发[C语言-041]-计算月份天数
  9. android结束进程、退出application的方法
  10. C# Hashtable中存入数组、List
  11. chrome扩展小试
  12. Pydev Console中文提示乱码的问题
  13. 查看ntp时间是否同步
  14. 如何更改github工程的语言属性
  15. SpringMVC 集成Log4j
  16. 15.scrapy模拟登陆案例
  17. Linux安装JDK(tar)
  18. python3模块: os
  19. git reset命令使用
  20. 一行代码避免OkHttp的网络库应用被抓包

热门文章

  1. java File获取字节流
  2. 洛谷P4003 [国家集训队2017]无限之环 网络流 最小费用最大流
  3. TodoList案例
  4. 【leetcode】1146. Snapshot Array
  5. Vue Vue项目目录结构梳理
  6. linux运维、架构之路-python2.6升级3.6
  7. E. Compress Words
  8. C/C++头文件的编写
  9. uva live 7637 Balanced String (贪心)
  10. 关于【C++项目:无法解析的外部符号】