我们需要知道一个事实,trie树上是可以要求第k大的!

我们每个节点记个size值然后像其他数据结构一样维护就可以了

然后我们再搞个priority_queue什么的就好了,注意每个值会出现两次只要记一次

 /**************************************************************
Problem: 3689
User: rausen
Language: C++
Result: Accepted
Time:4328 ms
Memory:44524 kb
****************************************************************/ #include <cstdio>
#include <queue> using namespace std;
const int N = 1e5 + ;
const int Tot_sz = N * ; struct trie_node {
trie_node *son[];
int sz;
} *null, *trie_root, mempool[Tot_sz], *cnt_trie = mempool; struct data {
int x, y, k;
data() {}
data(int _x, int _y, int _k) : x(_x), y(_y), k(_k) {} inline bool operator < (const data &a) const {
return x == a.x ? (y == a.y ? k > a.k : y > a.y) : x > a.x;
}
}; int n, m;
int a[N];
priority_queue <data> h; inline int read() {
int x = ;
char ch = getchar();
while (ch < '' || '' < ch)
ch = getchar();
while ('' <= ch && ch <= '') {
x = x * + ch - '';
ch = getchar();
}
return x;
} #define Son p -> son
#define Sz p -> sz
inline void trie_null(trie_node *&p) {
p = cnt_trie;
Son[] = Son[] = p;
Sz = ;
} inline void trie_new(trie_node *&p) {
p = ++cnt_trie, *p = *null;
} inline void trie_insert(int x) {
static trie_node *p;
static int i, t;
for (p = trie_root, ++Sz, i = ; ~i; --i) {
t = x >> i & ;
if (Son[t] == null) trie_new(Son[t]);
p = Son[t], ++Sz;
}
} inline int trie_query(int x, int rank) {
static trie_node *p;
static int i, t, res;
for (p = trie_root, i = , res = ; ~i; --i) {
t = x >> i & ;
if (rank <= Son[t] -> sz) p = Son[t];
else {
rank -= Son[t] -> sz;
res |= << i;
p = Son[!t];
}
}
return res;
}
#undef Son
#undef Sz int main() {
int i, x, y, k;
n = read(), m = read();
trie_null(null);
trie_new(trie_root);
for (i = ; i <= n; ++i) {
a[i] = read();
trie_insert(a[i]);
}
for (i = ; i <= n; ++i)
h.push(data(trie_query(a[i], ), a[i], ));
for (i = ; i < * m; ++i) {
x = h.top().x, y = h.top().y, k = h.top().k;
if (i & ) {
if (i != ) putchar(' ');
printf("%d", x);
}
h.pop();
h.push(data(trie_query(y, k + ), y, k + ));
}
return ;
}

(p.s. 注意会PE...然后改了一下输出边WA了QAQ...第三次才改对...)

BZOJ3689 异或之的更多相关文章

  1. bzoj2006 [NOI2010]超级钢琴 (及其拓展)

    bzoj2006 [NOI2010]超级钢琴 给定一个序列,求长度在 \([L,\ R]\) 之间的区间和的前 \(k\) 大之和 \(n\leq5\times10^5,\ k\leq2\times1 ...

  2. HBSX2019 游记

    Day -4 训练戳SX2019 3月训练 ZJOI2019 Day1几天前就考了 T1真考了麻将QwQ 九条可怜的毒瘤真的是业界良心 今天中午才起,要开始调整生物钟了 9012HBOIers群里讨论 ...

  3. [您有新的未分配科技点]可,可,可持久化!?------0-1Trie和可持久化Trie普及版讲解

    这一次,我们来了解普通Trie树的变种:0-1Trie以及在其基础上产生的可持久化Trie(其实,普通的Trie也可以可持久化,只是不太常见) 先简单介绍一下0-1Trie:一个0-1Trie节点只有 ...

  4. 【BZOJ3689】异或之 堆+可持久化Trie树

    [BZOJ3689]异或之 Description 给定n个非负整数A[1], A[2], ……, A[n].对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A ...

  5. 【bzoj3689】异或之 可持久化Trie树+堆

    题目描述 给定n个非负整数A[1], A[2], ……, A[n].对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这样共有n*(n ...

  6. Android数据加密之异或加密算法

    前言: 这几天被公司临时拉到去做Android IM即时通信协议实现,大致看了下他们定的协议,由于之前没有参与,据说因服务器性能限制,只达成非明文传递,具体原因我不太清楚,不过这里用的加密方式是采用异 ...

  7. Oracle数据库异机升级

    环境: A机:RHEL5.5 + Oracle 10.2.0.4 B机:RHEL5.5 需求: A机10.2.0.4数据库,在B机升级到11.2.0.4,应用最新PSU补丁程序. 目录: 一. 确认是 ...

  8. [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字

    Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  9. [PHP][位转换积累]之异或运算的简单加密应用

    异或的符号是^.按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0. xor运算的逆运算是它本身,也就是说两次异或同一个数 ...

随机推荐

  1. CSS3关于transition过渡

    第一次写博客,心里竟然有点感动,注册了两个月了,一直不敢写,总觉得这应该是大神交流的地方.今天写的一个css3的一个导航,觉得挺好看,放在网页里,也可以起到一个点睛之笔的作用. 首先写好body标签中 ...

  2. input与select 设置相同宽高,在浏览器上却显示不一致,不整齐

    遇到 input与select 设置相同宽高,在浏览器上却显示不一致,遂实验了下(IE 10.013 ,Firefox 30.0),得出以下结论 input   width,height 值里面, 不 ...

  3. Google账户_GooglePlay_关联

    PS:这过程叫一个折腾...穷逼的无奈啊... 1. 1.1. 网上搜到说,安装 google play & google框架服务,手机需要root,没去证实这个事情... 用了之前的 And ...

  4. Java异常与运行时异常,以及与线程的关系

    具体可以看这篇文章:http://www.cnblogs.com/charlesblc/p/6171103.html 都写在里面了,为了避免更新不一致,这里就不再写一遍了.只给个链接. 注意Java和 ...

  5. epoll中et+多线程模式中很重要的EPOLL_ONESHOT实验

    因为et模式需要循环读取,但是在读取过程中,如果有新的事件到达,很可能触发了其他线程来处理这个socket,那就乱了. EPOLL_ONESHOT就是用来避免这种情况.注意在一个线程处理完一个sock ...

  6. C语言语法之占用字节

    指针占用字节 指针即为地址,存的是变量的地址,在同一架构下地址长度都是相同的(cpu的最大寻址内存空间),所以不同类型的指针长度都一样. 指针占用几个字节跟语言无关,而是跟系统的寻址能力有关,16为地 ...

  7. uva 11800 Determine the Shape

    vjudge上题目链接:Determine the Shape 第二道独自 A 出的计算几何水题,题意就是给你四个点,让你判断它是哪种四边形:正方形.矩形.菱形.平行四边形.梯形 or 普通四边形. ...

  8. 关于图片加载非常爽的一个三方控件 fresco,一个三fresco

    Hi  EveryBody 今天来玩一个非常爽的控件 fresco 到底有多爽呢 接着看就知道了 首先 来看看fresco 是个神马东西 https://github.com/facebook/fre ...

  9. openfire教程网

    http://myopenfire.com/article/articledir/1#

  10. 在Maven中设置Nexus私有服务为中央工厂(repository)

    原文:http://blog.csdn.net/mexican_jacky/article/details/50275695 nexus中的仓库列表 第一种方式: <repositories&g ...