【CF888G】Xor-MST

题意:给你一张n个点的完全图,每个点有一个权值ai,i到j的边权使ai^aj,求这张图的最小生成树。

n<=200000,ai<2^30

题解:学到了求最小生成树的新姿势。

Boruvka算法:先对于每个点,选择在所有与之相连的边中,权值最小的边,并将这条边加入到最小生成树中。显然这样连出来的边会形成一个森林,并且连边后连通块个数至少减半。然后我们将每个连通块再看成一个点,重复以上算法即可。时间复杂度O(mlogn)。

对于本题,该如何优化呢?不难想到Trie树。我们很容易就能找到对于一个点,它与所有其它连通块中的点的连边中,权值最小的是哪个。然后这题就做完了。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=200010;
ll ans;
int n,m,tot;
int to[maxn],val[maxn],rt[maxn],f[maxn],v[maxn],bel[maxn];
vector<int> p[2][maxn];
vector<int>::iterator it;
struct node
{
int ch[2],siz;
}s[maxn*61];
inline void insert(int &x,int z,int w)
{
if(!x) x=++tot;
int i,u=x,d;
for(i=29;~i;i--)
{
d=(w>>i)&1;
if(!s[u].ch[d]) s[u].ch[d]=++tot;
u=s[u].ch[d],s[u].siz++;
}
s[u].siz=z;
}
inline void query(int x,int y,int z,int w)
{
int i,d,ret=0;
for(i=29;~i;i--)
{
d=(w>>i)&1;
if(s[s[x].ch[d]].siz==s[s[y].ch[d]].siz) d^=1,ret|=(1<<i);
x=s[x].ch[d],y=s[y].ch[d];
}
if(ret<val[z]) val[z]=ret,to[z]=s[x].siz;
}
int find(int x)
{
return (f[x]==x)?x:(f[x]=find(f[x]));
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
int main()
{
n=rd();
int i,d=0;
for(i=1;i<=n;i++) v[i]=rd();
sort(v+1,v+n+1);
for(i=1;i<=n;i++) if(i==1||v[i]>v[i-1]) p[0][++m].push_back(v[i]);
while(m>1)
{
n=m,m=0,memset(val,0x3f,sizeof(val[0])*(n+1)),memset(rt,0,sizeof(rt[0])*(n+1));
memset(s,0,sizeof(s[0])*(tot+1)),tot=0;
for(i=1;i<=n;i++) for(it=p[d][i].begin();it!=p[d][i].end();it++) insert(rt[i],i,*it),insert(rt[0],i,*it);
for(i=1;i<=n;i++) for(it=p[d][i].begin();it!=p[d][i].end();it++) query(rt[0],rt[i],i,*it);
for(i=1;i<=n;i++) p[d^1][i].clear(),f[i]=i;
for(i=1;i<=n;i++) if(find(to[i])!=find(i)) f[f[i]]=f[to[i]],ans+=val[i];
for(i=1;i<=n;i++) if(find(i)==i) bel[i]=++m;
for(i=1;i<=n;i++) for(it=p[d][i].begin();it!=p[d][i].end();it++) p[d^1][bel[f[i]]].push_back(*it);
d^=1;
}
printf("%I64d",ans);
return 0;
}

【CF888G】Xor-MST Trie树(模拟最小生成树)的更多相关文章

  1. usaco6.1-Cow XOR:trie树

    Cow XOR Adrian Vladu -- 2005 Farmer John is stuck with another problem while feeding his cows. All o ...

  2. 【BZOJ4523】[Cqoi2016]路由表 Trie树模拟

    [BZOJ4523][Cqoi2016]路由表 Description 路由表查找是路由器在转发IP报文时的重要环节.通常路由表中的表项由目的地址.掩码.下一跳(Next Hop)地址和其他辅助信息组 ...

  3. HDU 5269 ZYB loves Xor I Trie树

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5269 bc:http://bestcoder.hdu.edu.cn/contests/con ...

  4. hdu 4825 Xor Sum trie树

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Proble ...

  5. HDU4825 Xor Sum —— Trie树

    题目链接:https://vjudge.net/problem/HDU-4825 Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Li ...

  6. 【9.15校内测试】【寻找扩展可行域+特判】【Trie树 异或最小生成树】【模拟:)】

    之前都没做出来的同名题简直留下心理阴影啊...其实这道题还是挺好想的QAQ 可以发现,鸟可以走到的点是如下图这样扩展的: 由$(0,0)$向两边扩展,黑色是可以扩展到的点,红色是不能扩展的点,可以推出 ...

  7. 【CF888G】Xor-MST(最小生成树,Trie树)

    [CF888G]Xor-MST(最小生成树,Trie树) 题面 CF 洛谷 题解 利用\(Kruskal\)或者\(Prim\)算法都很不好计算. 然而我们还有一个叫啥来着?\(B\)啥啥的算法,就叫 ...

  8. cf888G. Xor-MST(Boruvka最小生成树 Trie树)

    题意 题目链接 给出\(n\)点,每个点有一个点权\(a[i]\),相邻两点之间的边权为\(a[i] \oplus a[j]\),求最小生成树的值 Sol 非常interesting的一道题,我做过两 ...

  9. [CF888G] Xor-mst (Trie 树,最小生成树)

    题目链接 Solution \(Trie\) 树 + 启发式合并. 考虑到是异或,于是按位贪心.让高位的尽量相同. 然后要计算每棵子树的代价,似乎并没有很好的方法?? 于是只能启发式合并. 对于每一个 ...

随机推荐

  1. saltstack系列2之zabbix-agent自动化部署

    实施前提条件 zabbix-agent通过编译安装的,打成tar包,并且自己先配好master的ip等等之类的配置在/etc下,然后我们后面只需要修改一个Hostname这个配置项即可.. salts ...

  2. cp -rf 提示覆盖解决办法

    cp覆盖时,无论加什么参数-f之类的还是提示是否覆盖,当文件比较少的时候还可以按Y确认,当很多文件的时候就不好说了 方法一:vi ~/.bashrc # .bashrc # User specific ...

  3. spring 定时任务corn表达式

    * * * * * * *  秒 分 时 日 月 周 年 秒 * / - 0-59 分 * / - 0-59 时 * / - 0-23 * 匹配任意数据 / 每隔多少分钟执行一次 - 区间 案例 0 ...

  4. oop思维意识,类 模块命名空间,类扩展之继承 、组合、mixin三种模式

    python的书都是讲怎么创建类怎么实例化对象,一般会用使用了,但还不具备这种编程意识.这是从python学习手册第四版节选出来的,书中说oop不仅是一种技术,更是一种经验.学习大神的看法,为什么需要 ...

  5. js精准时间迭代器(定时器)

    /** * 精准时间迭代器 * Create By Tujia @2017.05.22 * * 使用示例: * window.setMyInterval(function(){ * console.l ...

  6. 【RF库Collections测试】Remove From List

    Name:Remove From ListSource:Collections <test library>Arguments:[ list_ | index ]Removes and r ...

  7. requests 安装

    requests 是用来发送 HTTP 请求的一个库,requests 是对 urllib 和 urllib2 进行封装的一个模块,用来取代 urllib 和 urllib2,可以使用以下两种方法安装 ...

  8. ScrollView 定位

    1.固定到顶部scroll_view.requestFocusFromTouch();scroll_view.setScrollX(0); 2.固定到指定位置 int[] location = new ...

  9. AngularJS控制器和AngularJS过滤器的学习(3)

    前面简单的学习了AngularJS的表达式和指令,就可以说大概对AngularJS有了一定的了解吧,嘿嘿,下面就来总结学习一下AngularJS的控制器和过滤器哦. 说起来AngularJS控制器,其 ...

  10. mysql5.6.34-debug Source distribution在树莓派下编译的几个错误

    raspberrypi下编译mysql5.6 debug版源码. 1. 启动错误 和mysqld相关的文件及文件夹权限必须设置为mysql用户可读可写可执行,特别是/var/run/mysqld/目录 ...