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

题面

CF
洛谷

题解

利用\(Kruskal\)或者\(Prim\)算法都很不好计算。
然而我们还有一个叫啥来着?\(B\)啥啥的算法,就叫\(B\)算法吧。
思想是对于每个点找到一条最小边,并且将这条边连上,不难证明每次至少连上了\(n/2\)个点。
再将这些联通块看做一个点继续重复这个过程,时间复杂度是\(log\)级别的。

我们从高位往低位看,如果我们按照\(01\)分类,根据上述的过程,不难得到,如果\(01\)两个集合都存在的话,它们之间一定会连上一条边,并且\(01\)分类后的两个集合一定在内部形成联通块,这就很好办了,直接分治递归处理,每次拿\(Trie\)算一下\(01\)分类后两个集合之间边的最小值然后给连上就好。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define MAX 200200
#define pb push_back
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
int n,a[MAX],tot;
struct Node{int ch[2];}t[MAX<<5];
void insert(int &x,int w,int p)
{if(!x)x=++tot,t[x].ch[0]=t[x].ch[1]=0;if(p==-1)return;insert(t[x].ch[(w>>p)&1],w,p-1);
}
int Query(int x,int w,int p)
{if(p==-1)return 0;int c=(w>>p)&1;if(t[x].ch[c])return Query(t[x].ch[c],w,p-1);else return Query(t[x].ch[c^1],w,p-1)^(1<<p);
}
ll Solve(vector<int> v,int p)
{if(!v.size()||p==-1)return 0;vector<int> d[2];int ret=0,rt;for(int i:v)d[(i>>p)&1].pb(i);if(d[0].size()&&d[1].size()){ret=1<<(p+1);rt=tot=0;for(int i:d[0])insert(rt,i,30);for(int i:d[1])ret=min(ret,Query(rt,i,30));}return ret+Solve(d[0],p-1)+Solve(d[1],p-1);
}
int main()
{n=read();vector<int> a;for(int i=1;i<=n;++i)a.pb(read());printf("%I64d\n",Solve(a,30));return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/9479584.html

【CF888G】Xor-MST(最小生成树,Trie树)相关推荐

  1. CodeForces 1616H Keep XOR Low {a^b≤x} / CodeForces gym102331 Bitwise Xor {a^b≥x}(trie树 + 计数)

    文章目录 CodeForces 1616H Keep XOR Low problem solution code CodeForces gym102331 Bitwise Xor problem so ...

  2. 2021牛客暑期多校训练营4 E-Tree Xor(异或+思维+区间交 or Trie树)

    E-Tree Xor 首先不考虑区间限制条件,我们给定其中一个点的权值后,那么其他点的权值也就确定.比如 val1=0\text{val}_1=0val1​=0,即可通过变得限制求出其他点valu\t ...

  3. usaco Cowxor (trie 树)

    没想到trie树还可以用在这上面,厉害厉害. [分析]这是字母树的经典应用.首先因为是求xor的最大值,可以用前缀和计算xor值,然后n^2枚举即可. [cpp] view plaincopy for ...

  4. 【bzoj3261】最大异或和 可持久化Trie树

    题目描述 给定一个非负整数序列 {a},初始长度为 N.        有M个操作,有以下两种操作类型: 1.A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1. 2.Q l r x: ...

  5. P4735 最大异或和(可持久化trie树、求最大区间异或和)

    P4735 最大异或和 我们维护一个前缀异或和:s[i]=a[1]xora[2]xor-a[i−1]xora[i]s[i] = a[1] \ xor\ a[2]\ xor\ - a[i-1] \ xo ...

  6. 0x16.基本数据结构 — Trie树(字典树)+ A C 自 动 机

    目录 用TrieTrieTrie树来处理整数异或问题是真的舒服! 一.TrieTrieTrie树 TrieTrieTrie的基本操作 0.初始化 1.插入 2.检索 二.TrieTrieTrie树例题 ...

  7. BZOJ3261 最大异或和 解题报告(可持久化Trie树)

    本题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3261 题目描述 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类 ...

  8. [学习笔记]我们追过的神奇异或(Trie树系列)

    引言 刚学了\(Trie\)树,写篇博客巩固一下. 题目 首先安利一发\(Trie\)树模板 1.Phone List 2.The XOR largest pair 3.The xor-longest ...

  9. BZOJ #3166. [Heoi2013]Alo(可持久化trie树+set)

    #3166. [Heoi2013]Alo description solution code BZOJ3166 description Welcome to ALO ( Arithmetic and ...

最新文章

  1. Python 读写操作Excel —— 安装第三方库(xlrd、xlwt、xlutils、openpyxl)
  2. 光流 | 基于光流的运动物体语义分割(源代码)
  3. Python 字典中get() 函数
  4. [css] 使用overflow: scroll时不能平滑滚动怎样解决?
  5. 【C++深度剖析教程28】C++对象模型分析
  6. 老师们的神操作,但凡有一个是我的老师,我必定能上清华
  7. java php 女生数量,萌妹子告诉你php和java如何选
  8. VSCode使用记录一:ubuntu 16.04下安装、编译文件、制作桌面图标和卸载
  9. 项目管理第十一章项目风险管理
  10. VBA的表单控件初接触(2):ActiveX控件的基础功能和基础代码
  11. 印象笔记Mac版的快捷键有哪些?Evernote for Mac快捷键大全
  12. html 简繁转换 批量,[推荐]几行代码轻松搞定网页的【简繁转换】
  13. 【Kotlin-Room】 cannot pick a constructor since multiple constructors are suitable
  14. Code Project精彩系列(2)
  15. x265-1.8版本-common/pixel.cpp注释
  16. 计算机视觉——SIFT描述子
  17. 深度学习04 -模型管理
  18. 主板排行榜 一线二线三线等
  19. 精益供应链管理与算法(随笔)
  20. 数字电子技术(三)门电路

热门文章

  1. Java程序与数据库连接
  2. EOS经济系统分析[转载]
  3. Android开发架构规范
  4. Android安全教程(3)---Fiddler简易使用教程之抓取https包
  5. Qt 模式视图框架解读之委托
  6. CVPR 2017 CA:《Context-Aware Correlation Filter Tracking》论文笔记
  7. 计算机在气象上的应用浅论,简析计算机网络在气象服务中的应用原稿
  8. linux下qt多个程序打包,解决Ubuntu下使用linuxdeployqt打包Qt程序问题
  9. php网页微信登录验证失败,php 微信添加分账接收方-验证签名失败
  10. pandas中drop用法_如何使用drop方法对数据进行删减处理