CF888G Xor-MST
时间:2019-08-18
本文章向大家介绍CF888G Xor-MST,主要包括CF888G Xor-MST使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
problem
给出n个点,每个点有权值,求最小生成树。定义一条边的代价为所连接两点的权值异或值。
solution
考虑分治,根据最高位为0还是1分为两部分。然后分别求最小生成树。合并的时候就将最高位为0的一部分插入到trie中,然后从最高位为1的一部分中查询。
注意对trie的清空。
code
/*
* @Author: wxyww
* @Date: 2019-08-18 19:36:04
* @Last Modified time: 2019-08-18 20:20:03
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
typedef long long ll;
const int N = 200100,INF = 1e9;
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int tree[N * 31][2],a[N];
int n,tot;
int get(int x) {
for(int i = 29;i >= 0;--i) printf("%d",x >> i & 1);
puts("");
}
void add(int x) {
// get(x);
int p = 0;
for(int i = 29;i >= 0;--i) {
int k = x >> i & 1;
if(!tree[p][k]) tree[p][k] = ++tot;
p = tree[p][k];
}
}
int query(int x) {
// get(x);
int p = 0,ret = 0;
for(int i = 29;i >= 0;--i) {
int k = x >> i & 1;
if(!tree[p][1] && !tree[p][0]) return INF;
if(!tree[p][k]) {
ret += 1 << i;
p = tree[p][k ^ 1];
}
else p = tree[p][k];
}
// printf("%d\n",ret);
return ret;
}
ll solve(int l,int r,int pos) {
if(l > r) return 0;
// printf("%d %d %d\n",l,r,pos);
if(l == r || pos == -1) {
add(a[l]);
return 0;
}
int mid = r;
for(int i = l;i <= r;++i) {
if(a[i] >> pos & 1) {
mid = i - 1;break;
}
}
ll ret = 0;
ret += solve(l,mid,pos - 1);
int mn = INF;
for(int i = mid + 1;i <= r;++i) mn = min(mn,query(a[i]));
if(mn != INF) ret += mn;
for(int i = 0;i <= tot;++i) tree[i][0] = tree[i][1] = 0;
tot = 0;
ret += solve(mid + 1,r,pos - 1);
// for(int i = mid + 1;i <= r;++i) add(a[i]);
for(int i = l;i <= r;++i) add(a[i]);
// printf("%d\n",ret);
// printf("%d %d %d %d\n",l,r,pos,ret);
return ret;
}
int main() {
// freopen("1.in","r",stdin);
n = read();
for(int i = 1;i <= n;++i) a[i] = read();
sort(a + 1,a + n + 1);
// for(int i = 1;i <= n;++i) get(a[i]);
// puts("");
cout<<solve(1,n,29);
return 0;
}
原文地址:https://www.cnblogs.com/wxyww/p/CF888G.html
- OpenAI-人工反馈的深度学习
- 以太坊·将数据写入到区块链中
- 如何使用Faster R-CNN来计算对象个数
- hyperledger v1.0.5 区块链运维入门
- 在TensorBoard中使用t-SNE实现TensorFlow自动编码器的可视化嵌入
- 以太坊智能合约开发入门
- CatBoost:一个自动处理分类(CAT)数据的机器学习库
- Python机器学习的练习八:异常检测和推荐系统
- Blade 模板中有关 section 的那些事
- 分布式计划任务设计与实现
- 怎样在Python的深度学习库Keras中使用度量
- 网络设备配置管理与版本控制
- 使用Python对Instagram进行数据分析
- 解决多标签分类问题(包括案例研究)
- 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 数组属性和方法
- Logstash:处理多个 input
- 一文学会哈希法解题
- 一小时彻底掌握stm32中断。
- Python 爬虫进阶必备 | 关于某虚拟币网站加密签名的分析(难度0.1)
- PHP中的数据库连接持久化
- ClickHouse王炸功能即将来袭?
- 搭建Amoeba实现MySQL主从数据库读写分离
- 如何在centos7上看墙外的世界
- 远程仓库的使用
- 破解某交(y)友(p)app的VIP&&半自动im机器人
- 关于compareTo使用的几种情况
- 高通量数据中批次效应的鉴定和处理(二)
- 通过ansible管理docker容器
- HBASE 技术细节 读取与写入 Region Split与合并介绍
- django2.2+Daphne+nginx+supervisor 生产环境部署