HDU 6614 AND Minimum Spanning
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的更多相关文章
- 多校 HDU - 6614 AND Minimum Spanning Tree (二进制)
传送门 AND Minimum Spanning Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 ...
- 【HDU 4408】Minimum Spanning Tree(最小生成树计数)
Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...
- HDU 4408 Minimum Spanning Tree 最小生成树计数
Minimum Spanning Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- hdu 4408 Minimum Spanning Tree
Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...
- 数据结构与算法分析–Minimum Spanning Tree(最小生成树)
给定一个无向图,如果他的某个子图中,任意两个顶点都能互相连通并且是一棵树,那么这棵树就叫做生成树(spanning tree). 如果边上有权值,那么使得边权和最小的生成树叫做最小生成树(MST,Mi ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
随机推荐
- LeetCode算法题-Backspace String Compare(Java实现)
这是悦乐书的第327次更新,第350篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第197题(顺位题号是844).给定两个字符串S和T,如果两个字符串都输入到空文本编辑器 ...
- python+selenium切换窗口(获取句柄信息)
current_window_handle:获得当前窗口句柄: window_handles:返回所有窗口的句柄到当前会话: switch_to.window(suoyou[0]) ========= ...
- C函数调用过程原理及函数栈帧分析(转)
在x86的计算机系统中,内存空间中的栈主要用于保存函数的参数,返回值,返回地址,本地变量等.一切的函数调用都要将不同的数据.地址压入或者弹出栈.因此,为了更好地理解函数的调用,我们需要先来看看栈是怎么 ...
- 基于bs4库的HTML查找方法
基于bs4库的HTML查找方法 find_all方法 <>.find_all(name,attrs,recursive,string,**kwargs) 返回一个列表类型,内部存储查找的结 ...
- HDU 1043 Eight 八数码问题 A*算法(经典问题)
HDU 1043 Eight 八数码问题(经典问题) 题意 经典问题,就不再进行解释了. 这里主要是给你一个状态,然后要你求其到达\(1,2,3,4,5,6,7,8,x\)的转移路径. 解题思路 这里 ...
- PY个树状数组
树状数组看起来比较简单,于是就挑它下手了... 于是生活终于也对咱下手了... 要讲的就两个东西,一个是开数组,全局变量写最前面,数组是这么开的: f=[0 for i in range(500005 ...
- JCTF 2014 小菜两碟
测试文件:https://static2.ichunqiu.com/icq/resources/fileupload//CTF/JCTF2014/re200 参考文章:https://blog.csd ...
- numpy.random.randn()和numpy.random.rand()
1 numpy.random.rand() (1)numpy.random.rand(d0,d1,…,dn) rand函数根据给定维度生成[0,1)之间的数据,包含0,不包含1 dn表格每个维度 返回 ...
- 43. Multiply Strings (JAVA)
Given two non-negative integers num1 and num2represented as strings, return the product of num1 and ...
- 七、latex中的插图