博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CF888G]Xor-MST
阅读量:4639 次
发布时间:2019-06-09

本文共 1676 字,大约阅读时间需要 5 分钟。

题面

给定一个\(n\)个节点的完全图,每个节点有个编号\(a_i\),节点\(i\)和节点\(j\)之间边的权值为\(a_i\bigoplus a_j\),求该图的最小生成树的权值和。

  • \(n\leq2*10^5\)

    解析

    有个新奇的最小生成树算法:

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

从高位往低位贪心。

把所有点按当前位为\(0\)还是\(1\)分为两类。
显然这两类内部会形成联通块。

然后这两类间一定会有连边。

根据上面那个算法,如果我们选出两类数之间边权最小的那条边,这条边一定在最小生成树中。
因为这是当前状态下(两个大连通块)运行\(B\)算法后将得到的结果。
接下来分治对两类数内部进行处理。

找边权最小值,直接\(Trie\)树即可。

总复杂度\(O(mlogn)\)

#include
#include
#include
#include
#include
#include
#include
#define re register#define il inline#define ll long long#define pb push_back#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))#define fp(i,a,b) for(re int i=a;i<=b;i++)#define fq(i,a,b) for(re int i=a;i>=b;i--)using namespace std;const int mod=1e9+7,N=2e5+100;int n,tot,rt,t[N<<5][2];il ll gi(){ re ll x=0,t=1; re char ch=getchar(); while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar(); if(ch=='-') t=-1,ch=getchar(); while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar(); return x*t;}il void Insert(re int &u,re int x,re int d){ if(!u) u=++tot,t[u][0]=t[u][1]=0; if(d<0) return; Insert(t[u][(x>>d)&1],x,d-1);}il int Query(re int u,re int x,re int d){ if(d<0) return 0;re int c=(x>>d)&1; if(t[u][c]) return Query(t[u][c],x,d-1); if(t[u][c^1]) return Query(t[u][c^1],x,d-1)^(1<
a,re int d){ if(!a.size()||d<0) return 0; vector
b[2];re int mn=0; for(re int i=0;i
>d)&1].pb(a[i]); if(b[0].size()&&b[1].size()) { tot=rt=0;mn=1<<(d+1); for(re int i=0;i
a; fp(i,1,n) a.pb(gi()); printf("%lld\n",solve(a,30)); return 0;}

转载于:https://www.cnblogs.com/yanshannan/p/9496053.html

你可能感兴趣的文章
C3P0连接池工具类使用
查看>>
SVN常用命令备注
查看>>
孩子教育
查看>>
解决Cacti监控图像断断续续问题
查看>>
结构体的传参理解成员的存储方式
查看>>
python 进程与线程(理论部分)
查看>>
什么是API
查看>>
Java反射中method.isBridge() 桥接方法
查看>>
[shiro学习笔记]第二节 shiro与web融合实现一个简单的授权认证
查看>>
强名称程序集(strong name assembly)——为程序集赋予强名称
查看>>
1028. List Sorting (25)
查看>>
BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划
查看>>
ubuntu 重启命令,ubuntu 重启网卡方法
查看>>
Linux的学习:
查看>>
JavaScript中的原型继承原理
查看>>
Python logger模块
查看>>
jquery控制css的display(控制元素的显示与隐藏)
查看>>
关于python做人工智能的一个网页(很牛逼)
查看>>
判断控件的CGRect是否重合,获取控件的最大XY值
查看>>
POJ-1128 Frame Stacking
查看>>