bzoj 3689: 异或之 Trie+堆
题目大意:
题解:
利用一个优先队列存储当前取到的数
然后再写一颗支持查找异或的k大值的Trie即可
由于同一个值\(x\)可能被\(a_i\text{ xor }a_j\)和\(a_j\text{ xor }a_i\)一起取到
所以只有在奇数次取值的时候再更新
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const int maxn = 100010;
struct Node{
Node *ch[2];
int siz;
}*null,*root;
Node mem[maxn*33],*it;
inline void init(){
it = mem;null = it++;
null->ch[0] = null->ch[1] = null;
null->siz = 0;root = null;
}
inline Node* newNode(){
Node *p = it++;p->ch[0] = p->ch[1] = null;
p->siz = 0;return p;
}
void insert(int x){
Node *nw = root;nw->siz ++ ;
for(int i=30;i>=0;--i){
int id = (x>>i)&1;
if(nw->ch[id] == null) nw->ch[id] = newNode();
nw = nw->ch[id];nw->siz ++ ;
}
}
int kth(int x,int k){
int ret = 0;Node *nw = root;
for(int i=30;i>=0;--i){
int id = (x>>i)&1;
if(k <= nw->ch[id]->siz){
nw = nw->ch[id];
}else{
k -= nw->ch[id]->siz;
nw = nw->ch[id^1];
ret |= (1<<i);
}
}
return ret;
}
int a[maxn];
struct num{
int val,k,pos;
bool friend operator < (const num &a,const num &b){
return a.val > b.val;
}
num(const int &a,const int &b,const int &c){
val = a;k = b;pos = c;
}
};
priority_queue<num>q;
int main(){
init();root = newNode();
int n,k;read(n);read(k);
for(int i=1;i<=n;++i){
read(a[i]);
insert(a[i]);
}
for(int i=1;i<=n;++i){
q.push(num(kth(a[i],2),2,i));
}
int cnt = 0;k<<=1;
while(k--){
num tp = q.top();q.pop();
if((++cnt)&1) printf("%d ",tp.val);
if(tp.k == n) continue;
q.push(num(kth(a[tp.pos],tp.k+1),tp.k+1,tp.pos));
}
getchar();getchar();
return 0;
}
bzoj 3689: 异或之 Trie+堆的更多相关文章
- BZOJ 3689 异或 Trie木+堆
标题效果:特定n的数量,这种需求n数22 XOR的值前者k少 首先,我们建立了一个二进制的所有数字Trie木,您可以使用Trie木size域检查出一些其他的数字XOR值首先k少 然后,我们要保持一个堆 ...
- BZOJ 3689: 异或之 可持久化trie+堆
和超级钢琴几乎是同一道题吧... code: #include <bits/stdc++.h> #define N 200006 #define ll long long #define ...
- BZOJ 3689 异或之 (可持久化01Trie+堆)
题目大意:给你一个序列,求出第$K$大的两两异或值 先建出来可持久化$01Trie$ 用一个$set$/堆存结构体,存某个异或对$<i,j>$的第二关键字$j$,以及$ai\;xor\;a ...
- BZOJ 3689: 异或之
字典树可以$o(logn)查找第k大$ 使用$可持久化Trie 区间查找第k大,然后首先把每个数异或之后的最小丢进小根堆中,然后一个一个取出,取出后就再丢次小,一共取k次$ 总的时间复杂度为$O(kl ...
- BZOJ 5495: [2019省队联测]异或粽子 (trie树)
这题果然是原题[BZOJ 3689 异或之].看了BZOJ原题题解,发现自己sb了,直接每个位置维护一个值保存找到了以这个位置为右端点的第几大,初始全部都是1,把每个位置作为右端点能够异或出来的最大值 ...
- BZOJ 5495: [2019省队联测]异或粽子 可持久化trie+堆
和超级钢琴,异或之三倍经验 $?$ 堆+贪心素质三连 $?$ 好无聊...... code: #include <bits/stdc++.h> #define N 500006 #defi ...
- BZOJ_3689_异或之_可持久化Trie+堆
BZOJ_3689_异或之_可持久化Trie+堆 Description 给定n个非负整数A[1], A[2], ……, A[n]. 对于每对(i, j)满足1 <= i < j < ...
- [十二省联考2019]异或粽子(堆+可持久化Trie)
前置芝士:可持久化Trie & 堆 类似于超级钢琴,我们用堆维护一个四元组\((st, l, r, pos)\)表示以\(st\)为起点,终点在\([l, r]\)内,里面的最大值的位置为\( ...
- 异或之(bzoj 3689)
Description 给定n个非负整数A[1], A[2], --, A[n].对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这 ...
随机推荐
- python利用正则表达式提取字符串
前言 正则表达式的基础知识就不说了,有兴趣的可以点击这里,提取一般分两种情况,一种是提取在文本中提取单个位置的字符串,另一种是提取连续多个位置的字符串.日志分析会遇到这种情况,下面我会分别讲一下对应的 ...
- 批量删除redis某个键值
/usr/local/redis/src/redis-cli -h 172.28.6.23 -p 6383 keys "virtual*" |xargs /usr/local/r ...
- PhotoKit type类型
参考链接: https://www.jianshu.com/p/42e5d2f75452/ 1.获取图像类型 enum PHAssetCollectionType : Int { case Album ...
- Javascript对数组的操作--转载
在jquery中处理JSON数组的情况中遍历用到的比较多,但是用添加移除这些好像不是太多. 今天试过json[i].remove(),json.remove(i)之后都不行,看网页的DOM对象中好像J ...
- zabbix server 端安装
1.系统环境 [root@crazy-acong ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@crazy-acong ~] ...
- postgres=# psql -U postgres -h 127.0.0.1 -p 5432 -d dreamstart_dev -w
postgres=# psql -U postgres -h 127.0.0.1 -p 5432 -d dreamstart_dev -wpostgres-# \dNo relations found ...
- java面向对象入门之创建类
/* Name:如何创建类的实例 Power by Stuart Date:2015-4-23*/ //一个bike测试类 public class bikeTest{ //bike 一个变量 Str ...
- Java内部类(转发:)
内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. 内部类分为: 成员内部类.局部内部类.静态嵌套类.匿名内部类 . 1.成员内部类 成员内部类是最普通的内部类,它的定义为位于另一个类 ...
- 改善程序与设计的55个具体做法 day8
条款20:宁以pass-by-reference-to-const 替换 pass-by-value 即 以const引用 替换值传递. 采用引用传递参数时,底层往往是用指针方式实现,因此参数传递内置 ...
- 扩展 Yii2 自带的日志组件
<?php /** * author : forecho <caizhenghai@gmail.com> * createTime : 2015/12/22 18:13 * desc ...