Time limit 1000 ms

Memory limit 131072 kB

OS Windows

中文题意

给一张n个点的无向完全图(输入一个n就完事了),每个点标号为1n,每条边的边权为它的两个端点的标号做按位与。现在要求这个图的最小生成树,输出这棵树以1为根时2n总共n-1个点的父亲节点的标号(为啥不是母亲)。要求在该树边权和最小的前提下,输出的数据字典序最小。

解题思路

以1为根,那就把1固定下来吧。

对于所有偶数点,肯定要以1为父亲,因为首先边权为0,其次因为字典序最小的要求,1是它们可以连到的编号最小的父亲。

对于所有奇数点,我们肯定希望它连接到父亲的边权是0,那么它和父亲的二进制位就不能有同时为1的地方。又因为字典序最小的要求,它能连接到的边权为0、标号最小的父亲是哪位呢?我们想到了lowbit,我们可以将该奇数点编号取反,然后强行将最高位符号位置0,再求lowbit,就得到了我们希望它连接的父亲。换句话说,一个奇数点x的父亲应该是

lowbit(0x7fffffff&(~x))

比如对于13号点,二进制为1101,它的父亲就应该是0010。还没完,假设总共有7个点,那么7号点的父亲是谁呢?按照上面的分析,应该是8号点,但是没有8号点,而且因为7的二进制是0111,无论连到其他哪个点上边权都不为0,所以要让权值最小,我们只能把这种理论父亲不存在的点连接到1号点。

源代码

#include<stdio.h>

int T;
int n;
long long sum;
int fa[200010];
inline int lowbit(int x){return x&-x;}
int main()
{
scanf("%d",&T);
while(T--)
{
sum=0;
scanf("%d",&n);
for(int i=2;i<=n;i+=2) fa[i]=1;
for(int i=3;i<=n;i+=2)
{
if(lowbit(i)==i) continue;
int lowzero=lowbit((~i)&0x7fffffff);//求理论父亲
if(lowzero>n) sum++,fa[i]=1;//理论父亲不存在
else fa[i]=lowzero;
}
printf("%d\n%d",sum,fa[2]);//这题卡PE艹
for(int i=3;i<=n;i++)
printf(" %d",fa[i]);
puts("");
}
return 0;
}

HDU 6614 AND Minimum Spanning的更多相关文章

  1. 多校 HDU - 6614 AND Minimum Spanning Tree (二进制)

    传送门 AND Minimum Spanning Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 ...

  2. 【HDU 4408】Minimum Spanning Tree(最小生成树计数)

    Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...

  3. HDU 4408 Minimum Spanning Tree 最小生成树计数

    Minimum Spanning Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  4. hdu 4408 Minimum Spanning Tree

    Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...

  5. 数据结构与算法分析–Minimum Spanning Tree(最小生成树)

    给定一个无向图,如果他的某个子图中,任意两个顶点都能互相连通并且是一棵树,那么这棵树就叫做生成树(spanning tree). 如果边上有权值,那么使得边权和最小的生成树叫做最小生成树(MST,Mi ...

  6. Educational Codeforces Round 3 E. Minimum spanning tree for each edge LCA/(树链剖分+数据结构) + MST

    E. Minimum spanning tree for each edge   Connected undirected weighted graph without self-loops and ...

  7. CF# Educational Codeforces Round 3 E. Minimum spanning tree for each edge

    E. Minimum spanning tree for each edge time limit per test 2 seconds memory limit per test 256 megab ...

  8. Codeforces Educational Codeforces Round 3 E. Minimum spanning tree for each edge LCA链上最大值

    E. Minimum spanning tree for each edge 题目连接: http://www.codeforces.com/contest/609/problem/E Descrip ...

  9. MST(Kruskal’s Minimum Spanning Tree Algorithm)

    You may refer to the main idea of MST in graph theory. http://en.wikipedia.org/wiki/Minimum_spanning ...

随机推荐

  1. 使用TestNG框架测试用例执行顺序问题

    既然是讨论执行顺序问题,那么用例肯定是批量执行的,批量执行的方法有mvn test.直接运行testng.xml文件,其中直接运行testng.xml文件的效果与pom文件中配置执行testng.xm ...

  2. mysql先分组,然后取每个分组中的第2大的记录

    文章参考http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/ 首先建表: ...

  3. [Web 前端] 029 jQuery 元素的“节操”

    目录 jQuery 元素的节点操作 1. 创建节点 2. 插入节点 2.1 在现存元素的内部,从后面插入元素 2.2 在现存元素的内部,从前面插入元素 2.3 在现存元素的外部,从后面插入元素 2.4 ...

  4. C#基础篇之C#和 .Net框架的概念和运行原理

    一.微软平台的发展史 二..Net框架包含的东西 1.名词解释 BCL:基类库(Base Class Library)系统和底层提供的最基本的类库 CLR:公共语言运行时(Common Languag ...

  5. WHY吃糖果 QDUOJ 二分嵌套

    WHY吃糖果 QDUOJ 二分嵌套 原题链接 解题思路参考链接 题意 给出一个\(n*n\)的矩阵,每个格子的权值为\(i*i+j*j+i*j+100000*(i-j)\),求该矩阵中第m小的权值为多 ...

  6. 图——图的Kruskal法最小生成树实现

    1,最小生成树的特征: 1,选取的边是图中权值较小的边: 2,所有边连接后不构成回路: 2,prim 算法是以顶点为核心的,最下生成树最大的特征是边,但 prim 算法非要以顶点为核心来进行,有些复杂 ...

  7. 剑指offer-栈的压入、弹出序列-栈和队列-python

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...

  8. vue图片不存在时加载默认图片

    在文件中的img那里添加:οnerrοr="errorImg01",然后设置errorImg01的路径如果直接写成 errorImg01: ('../../assets/image ...

  9. C++函数声明与定义

    一个C++函数,如果没有函数声明而只有函数定义,程序照样运行,但要求这个函数定义必须放在main函数之前,否则编译按照从上到下的顺序扫描下来,就会出现编译器不认识它的情况. 如果一个程序同时有函数声明 ...

  10. 互联网技术笔试总通不过?leetcode刷对了么

    https://36kr.com/p/5084645 Leetcode,绕都绕不过去的程序员刷题神器 编者按:本文来自逆行求职(ID:nixingjihua). 对所有求职技术岗位的童鞋来说,有这么一 ...