CF888G XOR-MST 最小异或生成树
时间:2019-08-24
本文章向大家介绍CF888G XOR-MST 最小异或生成树,主要包括CF888G XOR-MST 最小异或生成树使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
CF888G XOR-MST
链接
思路
trie上贪心,先左右两边连边,再用一条边的代价连起左右两颗树。因为内部的边一定比跨两棵树的边权笑,显然是对的。
代码自己瞎yy的。启发式合并
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int _=2e5+7;
int n,a[_],ch[_*30][2],siz[_*30],cnt,col,rt[_*30];
ll ans;
std::vector<int> dsr[_*30];
void insert(int x) {
int p=0;
for(int i=29;i>=0;--i) {
bool k=x&(1LL<<i);
siz[p]++;
if(!ch[p][k]) ch[p][k]=++cnt;
p=ch[p][k];
} siz[p]++;
if(!rt[p]) rt[p]=++col;
dsr[rt[p]].push_back(x);
}
int query(int rt,int init,int x) {
int p=rt,ans=0;
for(int i=init;i>=0;--i) {
bool k=x&(1LL<<i);
if(ch[p][k]) p=ch[p][k];
else p=ch[p][!k],ans|=1<<i;
}
return ans;
}
void dfs(int p,int dep) {
if(!ch[p][0]&&!ch[p][1]) return;
if(!ch[p][0]||!ch[p][1]) {
dfs(ch[p][0]|ch[p][1],dep-1);
rt[p]=rt[ch[p][0]|ch[p][1]];
} else {
int k=siz[ch[p][0]]<siz[ch[p][1]];
dfs(ch[p][0],dep-1),dfs(ch[p][1],dep-1);
rt[p]=rt[ch[p][k]];
int tmp=0x3f3f3f3f;
int nb=ch[p][!k];
ch[p][!k]=0;
for(auto x:dsr[rt[nb]]) {
tmp=min(tmp,query(p,dep,x));
dsr[rt[p]].push_back(x);
}
ans+=tmp;
ch[p][!k]=nb;
}
}
int main() {
// freopen("a.in","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]),insert(a[i]);
dfs(0,29);
cout<<ans<<"\n";
return 0;
}
原文地址:https://www.cnblogs.com/dsrdsr/p/11405990.html
- 使用Spring Cloud Security OAuth2搭建授权服务
- Nginx性能优化
- linux 如何正确的关闭mongodb
- 运用Aggregator模式实现MapReduce
- vue 2 使用Bus.js进行兄弟(非父子)组件通信 简单案例
- spring boot项目在外部tomcat环境下部署
- 利用Actor实现管道过滤器模式
- SpringBoot整合Quartz定时任务 的简单实例
- 从机器学习学python(一) ——numpy中的shape、tile、argsort
- 剖析响应式编程的本质
- 从机器学习学python(二) ——iteritems、itemgetter、sorted、sort
- 基于MVC理解React+Redux
- JavaScript的IIFE(即时执行方法)
- 从机器学习学python(三) ——数组冒号取值与extend
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一张千万级别数据的表想做分页,如何优化?
- 一文学会爬虫技巧
- 为什么机器学习应用交易那么难(中)
- 消息队列的消费幂等性如何保证
- js中数组Array.reduce方法介绍及使用场景
- 推荐一套基于go开发的文档管理系统
- 如何通过容器搭建稳定可靠的私有网盘(NextCloud)
- Flutter实现倒计时功能
- Excelize 2.3.0 发布, Go 语言 Excel 基础库
- 网站渗透攻防Web篇之SQL注入攻击高级篇
- 网站渗透攻防Web篇之SQL注入攻击中级篇
- Go 语言学习之 method
- 网站渗透攻防Web篇之SQL注入攻击初级篇
- VBA解析复合文档05——读取数据流
- C++核心准则E.25:如果不能抛出异常,模仿RAII方式进行资源管理