题目链接

Boruvka生成树算法

\(Boruvka\)算法就是先把每个点看作一个联通块,然后不断在联通块之间找最优的边进行合并。因为每次联通块的数量最少缩小一半。所以合并次数是\(log\)的

先把所有的点权挂到\(trie\)树上。然后对于每个联通块进行合并的时候。对于联通块中的每个点都去\(trie\)上搜索他能找到的最优秀的边。也就是说如果当前位置是\(1\)那么就搜索1子树,否则的话既要搜0子树,也要搜1子树。这样1子树是一定要搜的。所以把0子树变为1子树和0子树合并起来的结果。然后就可以搜索了。

还有一个问题就是。如果当前子树中的所有点都已经在这个联通块里了怎么办。所以统计出每棵子树中联通块编号的最大值和最小值。然后就可以知道当前子树中是不是还有不属于这个联通块里的点了。合并联通块之后再把每个点合并的联通块里的点所属的联通块修改一下就行了。

复杂度\(O((n+2^m)mlogn)\)

更优秀的做法

上面的做法代码长且思路复杂。有一种更好的做法。

先把所有权值相同的点连一条边。这样肯定会比较优秀。

然后考虑枚举最终答案中\(w[u]\&w[v]\)的值p。

因为\(x\&w[u] \leq w[u]\),倒着枚举p,然后找到一个点u使得\(w[u]\&p=p\)。然后从其他的等于满足\(w[v]\&p=p\)的点\(v\)中找一个与\(u\)不在同一个联通块里的点。将这两个点之间连边。贡献为\(p\)。

万一\(w[u]\&w[v]\)比\(p\)大呢。可以证明这是不可能的。因为p是倒着枚举的,如果\(w[u]\&w[v]>p\)那么肯定之前就连过边了。不会再连一次。

复杂度\(O(2^mm\alpha(n))\)

代码

/*
* @Author: wxyww
* @Date: 2019-01-21 15:46:58
* @Last Modified time: 2019-01-21 15:53:01
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<bitset>
using namespace std;
typedef long long ll;
const int N = 1000000 +10;
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int p[N],fa[N];
ll ans;
int find(int x) {
return fa[x] == x ? x :fa[x] = find(fa[x]);
}
void uni(int x,int y) {
x = find(x),y = find(y);
if(rand() & 1) fa[x] = y;
else fa[y] = x;
}
int main() {
srand(time(0));
int n = read(),m = read();
for(int i = 1;i <= n;++i) {
int x = read();
if(p[x]) ans += x;
p[x] = x;
}
int k = (1 << m);
for(int i = 1;i <= k;++i) fa[i] = i;
for(int i = (1 << m) - 1;i;--i) {
for(int j = 0;j < m && !p[i];++j) p[i] = p[i | (1 << j)];
int u = p[i];
if(!u) continue;
for(int j = 0;j < m;++j) {
int v = p[i | (1 << j)];
if(!v) continue;
if(find(v) != find(u)) {
ans += i;
uni(u,v);
}
}
}
cout<<ans; return 0;
}

UOJ176 新年的繁荣的更多相关文章

  1. C. 新年的繁荣

    题解: 用最小生成树的Boruvka算法 即每次找到每个点不在它联通块的边内的最大值 然后进行log次这个过程 然后找这个的话我们可以用trie树在2^m的时间内完成建树(如果是1要合并到0上)

  2. UOJ 176 新年的繁荣

    挺妙的解法. 发现边权很小,我们可以考虑从大到小枚举边权来进行$kruskal$算法,这样子对于每一个边权$i$,我们只要枚举$0 \leq j < m$,找到一个点使它的点权为$i | 2^j ...

  3. CF888G Xor-MST[最小生成树+01trie]

    前注:关于这题,本人的解法暂时没有成功通过此题,原因是被卡常了.可能需要等待某种机缘来请人调试. 类似uoj的一道题(新年的繁荣),不过是一个有些简单的版本. 因为是完全图,有没有办法明显优化建边,所 ...

  4. 金牛来到,福气来到——TcaplusDB新年放送

    光阴似箭,2020转瞬间成为历史,牛年的钟声即将敲响,在此,TcaplusDB祝大家新的一年万事如意,牛年带给我们的福气,一定能让我们心想事成! 饮水思源,回顾过去的一年,我们深知,TcaplusDB ...

  5. 新年抢红包效果(New Year Red Packet)

    新年抢红包效果(New Year Red Packet) 晓娜的文章(微信公众号:migufe) 2016即将过去,我们将迎来新的一年2017,这里小编提前祝大家新年快乐!万事如意!那我们新年最开心的 ...

  6. 【UOJ#67】新年的毒瘤 Tarjan 割点

    #67. 新年的毒瘤 UOJ直接黏贴会炸...    还是戳这里吧: http://uoj.ac/problem/67#tab-statement Solution 看到这题的标签就进来看了一眼. 想 ...

  7. 喜迎2015年新年:坦克大战(Robocode)游戏编程比赛图文总结

    2015春节前,葡萄城的软件工程师以特有的方式来迎接新年——2015新年编程邀请赛. 邀请赛的初衷,是和大家一起,寻找编程最初的单纯的快乐.       在代码的世界里,添加动力,继续远航.      ...

  8. uoj 67 新年的毒瘤 割点

    题目链接: 题目 #67. 新年的毒瘤 问题描述 辞旧迎新之际,喜羊羊正在打理羊村的绿化带,然后他发现了一棵长着毒瘤的树. 这个长着毒瘤的树可以用 nn 个结点 mm 条无向边的无向图表示.这个图中有 ...

  9. CT 来值班,让您安心过新年!

    春节,盼了整整一年的节日,我们一定要抛开工作,狠狠的开心,狠狠的幸福,但是作为苦逼的运维,你们真的能完全抛开工作(对网站不闻不问)吗?OneAPM CT 24 小时监控您的网站,让您无忧无虑过新年. ...

随机推荐

  1. IntelliJ IDEA -- 破解

    ① 到这个地方下载 IntelliJ IDEA 注册码:http://idea.lanyus.com/  就是这个jar包:JetbrainsCrack-2.6.10-release-enc.jar ...

  2. ADO.NET工具类(三)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  3. codeforces630C

    Lucky Numbers CodeForces - 630C 小希称只含7和8的数是幸运数,那么不超过n位的幸运数有多少个? Input 一个整数 n (1 ≤ n ≤ 55) Output 输出幸 ...

  4. codeforces-962-c

    题意:给你一个数,问从中删除某几位数字后重新组成的数字是否是某个数的平方: 解题思路:数据小,dfs直接搜,每位数只有两种选择,要或者不要 #include<iostream> #incl ...

  5. mysql-tar包搭建过程

    第一: wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz tar z ...

  6. 在一台服务器上配置多个Tomcat的方法

    原文来自:http://blog.csdn.net/lmb55/article/details/49561669 这段时间在开发智能导航的热部署功能,需要从一台服务器去访问其它的24台服务器去进行相关 ...

  7. VM下安装Kali虚拟机

    VM下Kali虚拟机安装 下载kali Linux系统镜像 下载地址:http://mirrors.hust.edu.cn/kali-images/ 网页如下: kali官网:http://www.k ...

  8. LOJ6053 简单的函数 【Min_25筛】【埃拉托斯特尼筛】

    先定义几个符号: []:若方括号内为一个值,则向下取整,否则为布尔判断 集合P:素数集合. 题目分析: 题目是一个积性函数.做法之一是洲阁筛,也可以采用Min_25筛. 对于一个可以进行Min_25筛 ...

  9. [USACO12MAR] 花盆Flowerpot

    类型:二分+单调队列 传送门:>Here< 题意:给出$N$个点的坐标,要求根据$x$轴选定一段区间$[L,R]$,使得其中的点的最大与最小的$y$值之差$\geq D$.求$Min\{R ...

  10. 使用ROME解析rss,如何获取icon图标

    问题 网站使用SpringMVC框架,实现了RSS订阅,但是在阅读器里面,只有网站的标题,没有网站的图标. 分析 ROME会从<channel>标签下指定的<link>地址中, ...