【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. curl tutorial with examples of usage

    原文:http://www.yilmazhuseyin.com/blog/dev/curl-tutorial-examples-usage/ 阮一峰的这个教程也不错:http://www.ruanyi ...

  2. CorelDRAW中如何分布对象

    分布对象功能主要用来控制选择对象之间的距离,可以满足用户对均匀间距的要求,通常用于选择三个或三个以上的物体,将他们之间的距离平均分布.本教程将详解CorelDRAW中关于分布对象的操作. CorelD ...

  3. 针对降质模型中的模糊SR

    (PDF) Deep Plug-and-Play Super-Resolution for Arbitrary Blur Kernels https://www.researchgate.net/pu ...

  4. VC++调用MSFlexGrid的SetRow方法,出现异常“Invalid Row Value”

    MSFlexGrid是微软提供的网格表格控件,SetRow方法用于设置当前焦点所在行.  C++ Code  12345   void CMSFlexGrid::SetRow(long nNewVal ...

  5. c++const关键字---15

    原创博文,转载请标明出处--周学伟 http://www.cnblogs.com/zxouxuewei/ const是一个C++语言的限定符,它限定一个变量不允许被改变.使用const在一定程度上可以 ...

  6. jquery组件WebUploader文件上传用法详解

    这篇文章主要为大家详细介绍了jquery组件WebUploader文件上传用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 WebUploader是由Baidu WebFE(FEX)团队开发的一 ...

  7. Android和IOS开发学习路线

    图片看上去太小,直接另存为吧 图片来自:http://www.finalshares.com/

  8. phonegap入门–3 Android phonegap 自定义插件DEMO

    一.环境要求:      首先需要建立phonegap android 工程,请参考:http://www.cnblogs.com/zhujinguo/p/4369883.html 二.建立java类 ...

  9. Java -- 异常的捕获及处理 -- Exception类与RuntimeException类

    7.3 Exception类与RuntimeException类 Exception类与RuntimeException类的联系与区别??? 例:字符串变为整型 Class : RuntimeExce ...

  10. 虚拟机中多个Linux系统之间配置免秘钥访问

    1.三个节点cdh1,cdh2,cdh3 2.在每个机器上分别生产公钥对 ssh-keygen -t rsa 3.复制公钥 cd .ssh cat  id_rsa.pub  >> auth ...