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],这 ...
随机推荐
- 自然常数e的神奇之美
- 6.2.1-FactoryBeanRegistrySupport(未全)
FactoryBeanRegistrySupport 的关系图: 添加工厂方式创建类FactoryBean的支持
- every row of W is a classifier for one of the classes
every row of W is a classifier for one of the classes As we saw above, every row of W is a classifie ...
- 我的Android进阶之旅------>如何将Activity变为半透明的对话框?
我的Android进阶之旅------>如何将Activity变为半透明的对话框?可以从两个方面来考虑:对话框和半透明. 在定义Activity时指定Theme.Dialog主题就可以将Acti ...
- bash: /home/aprilpeng/.bashrc: Permission denied
bash: /home/aprilpeng/.bashrc: Permission denied 出现这样的权限问题,一般是在切换用户的时候,用户没有该目录的权限 可以$chown -R git:us ...
- Failed to decode response: zlib_decode(): data error Retrying with degraded;
composer update的时候出现: Failed to decode response: zlib_decode(): data error Retrying with degraded: 执 ...
- Java中byte转换int时与0xff进行与运算的原因
http://w.baike.com/LGAdcWgJBBQxRAHUf.html 转帖 java中byte转换int时为何与0xff进行与运算 在剖析该问题前请看如下代码 public static ...
- 微信小程序高度设置为100%
在网页中设置body,html{height:100%}; 将body和html设置为100%,这样我们就可以在他们的子元素中使用height:100%来使的我们的容器元素占满屏幕的高度啦. 但是在微 ...
- Android shape制作圆角、虚线、渐变
xml控件配置属性 android:background="@drawable/shape" 标签 corners ----------圆角 gradient ---------- ...
- RockerMQ connect to<:10009>fail
producer端发送报错 com.alibaba.rocketmq.client.exception.MQClientException: Send [] times, still failed, ...