博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3689 异或之
阅读量:5313 次
发布时间:2019-06-14

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

题目描述:

给定n个非负整数A[1], A[2], ……, A[n]。

对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这样共有n*(n-1)/2个新的数。求这些数(不包含A[i])中前k小的数。

题解:

建一棵01Trie树,然后把所有数扔进去。

将所有数的当前相关最小值插入优先队列,每次弹出来一个。

因为同一对会出现两次,所以我们只能选取奇数次弹出的点。

每弹出一个就将相关数的更小值插进去。

代码:

#include
#include
#include
#include
using namespace std;#define N 100050#define ll long longinline int rd(){ int f=1,c=0;char ch=getchar(); while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){c=10*c+ch-'0';ch=getchar();} return f*c;}int n,k,a[N],rt[N],sum;struct node{ int x; ll v; node(){} node(int x,ll v):x(x),v(v){} friend bool operator < (node a,node b) { return a.v>b.v; }};priority_queue
que;int dep[N];struct Trie{ int tot,siz[35*N],ch[35*N][2]; void insert(int x) { int u=1; for(int i=30;i>=0;i--) { int c = (x>>i)&1; siz[u]++; if(!ch[u][c])ch[u][c]=++tot; u=ch[u][c]; } siz[u]++; } ll query(int x,int k) { ll ret = 0; int u = 1; for(int i=30;i>=0;i--) { int c = (x>>i)&1; if(siz[ch[u][c]]>=k) { u=ch[u][c]; }else { ret|=(1ll<

 

转载于:https://www.cnblogs.com/LiGuanlin1124/p/10046267.html

你可能感兴趣的文章
[转载]由浅入深理解索引的实现(2)
查看>>
gnome 3.8更新 让人失望
查看>>
模块相关
查看>>
java动态生成验证码图片
查看>>
WIN CE和电脑之间的文件拷贝(1) Form1.Designer.cs文件
查看>>
无限循环
查看>>
集成备注
查看>>
关于一个隐藏和显示物品列表的demo
查看>>
_stdcall 函数 debug/release汇编代码区别
查看>>
快速构建Windows 8风格应用7-页面视图概览
查看>>
The Definitive Guide To Django 2 学习笔记(五) 第四章 模板 (一)基本模板系统
查看>>
eclipse中logcat偶尔不显示log的问题解决办法
查看>>
mac环境下安装配置mysql
查看>>
Radar Installation 贪心
查看>>
js浮点数的加减乘除
查看>>
svg绘制一个简单地饼图
查看>>
从零开始学习html(十四)单位和值
查看>>
atom编辑器安装说明
查看>>
团队组员得分分配工作(改动)——PM(李忠)
查看>>
我的开源项目
查看>>