UOJ176 新年的繁荣
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 新年的繁荣的更多相关文章
- C. 新年的繁荣
题解: 用最小生成树的Boruvka算法 即每次找到每个点不在它联通块的边内的最大值 然后进行log次这个过程 然后找这个的话我们可以用trie树在2^m的时间内完成建树(如果是1要合并到0上)
- UOJ 176 新年的繁荣
挺妙的解法. 发现边权很小,我们可以考虑从大到小枚举边权来进行$kruskal$算法,这样子对于每一个边权$i$,我们只要枚举$0 \leq j < m$,找到一个点使它的点权为$i | 2^j ...
- CF888G Xor-MST[最小生成树+01trie]
前注:关于这题,本人的解法暂时没有成功通过此题,原因是被卡常了.可能需要等待某种机缘来请人调试. 类似uoj的一道题(新年的繁荣),不过是一个有些简单的版本. 因为是完全图,有没有办法明显优化建边,所 ...
- 金牛来到,福气来到——TcaplusDB新年放送
光阴似箭,2020转瞬间成为历史,牛年的钟声即将敲响,在此,TcaplusDB祝大家新的一年万事如意,牛年带给我们的福气,一定能让我们心想事成! 饮水思源,回顾过去的一年,我们深知,TcaplusDB ...
- 新年抢红包效果(New Year Red Packet)
新年抢红包效果(New Year Red Packet) 晓娜的文章(微信公众号:migufe) 2016即将过去,我们将迎来新的一年2017,这里小编提前祝大家新年快乐!万事如意!那我们新年最开心的 ...
- 【UOJ#67】新年的毒瘤 Tarjan 割点
#67. 新年的毒瘤 UOJ直接黏贴会炸... 还是戳这里吧: http://uoj.ac/problem/67#tab-statement Solution 看到这题的标签就进来看了一眼. 想 ...
- 喜迎2015年新年:坦克大战(Robocode)游戏编程比赛图文总结
2015春节前,葡萄城的软件工程师以特有的方式来迎接新年——2015新年编程邀请赛. 邀请赛的初衷,是和大家一起,寻找编程最初的单纯的快乐. 在代码的世界里,添加动力,继续远航. ...
- uoj 67 新年的毒瘤 割点
题目链接: 题目 #67. 新年的毒瘤 问题描述 辞旧迎新之际,喜羊羊正在打理羊村的绿化带,然后他发现了一棵长着毒瘤的树. 这个长着毒瘤的树可以用 nn 个结点 mm 条无向边的无向图表示.这个图中有 ...
- CT 来值班,让您安心过新年!
春节,盼了整整一年的节日,我们一定要抛开工作,狠狠的开心,狠狠的幸福,但是作为苦逼的运维,你们真的能完全抛开工作(对网站不闻不问)吗?OneAPM CT 24 小时监控您的网站,让您无忧无虑过新年. ...
随机推荐
- 补充:pyhton 2 和3中的beyts类型
在python2里,bytes == str python2里还有个单独的类型是unicode , 把字符串解码后,就会变成unicode. 既然python2中byets == str,那为什么还要 ...
- Day 4-1 模块的导入方法和路径
什么是模块? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码 ...
- JS --- 本地保存localStorage、sessionStorage用法总结
JS的本地保存localStorage.sessionStorage用法总结 localStorage.sessionStorage是Html5的特性,IE7以下浏览器不支持 为什么要掌握localS ...
- UTF-8编码与GBK编码下的字符长度
源码: package lsh.java.charset; import java.nio.charset.Charset; public class LengthOfUTF_8 { public s ...
- ansible的playbook简单使用
一.介绍 playbook就是一个用yaml语法把多个模块堆起来的一个文件 核心组件: Hosts:执行的远程主机列表Tasks:任务,由模块定义的操作的列表:Varniables:内置变量或自定义变 ...
- 记一次ntp反射放大ddos攻击
2018/3/26 ,共计310G左右的DDoS攻击 临时解决办法:将web服务转移到同生产一个内网段的备份服务器a上,a提供web端口80,数据库通过内网连接还是沿用生产数据库. 后续解决办法:通过 ...
- comparable和comparator
Comparable Comparable可以认为是一个内部比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,在compareTo方法中指定具体的比较方法. comp ...
- python数学第七天【期望的性质】
- No module named 'ConfigParser'
系统: CentOS-6.4-x86_64 Python : Python 3.4.5 和 Python 3.5.2 安装 MySQL-python ,结果出错: ImportError: No mo ...
- eclipse中将Java项目转换为JavaWeb项目
eclipse导入一些war项目后,会以java项目形式存在,因此我们需要将java项目转换成web项目,不然项目也许会报错. 1.右键已经导入的项目,选择properties. 2.选中projec ...