我们需要知道一个事实,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;
 ;
 ;

 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() {
     ;
     char ch = getchar();
     ' < ch)
         ch = getchar();
     ') {
         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;
     ; ~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;
     , 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);
     ; i <= n; ++i) {
         a[i] = read();
         trie_insert(a[i]);
     }
     ; i <= n; ++i)
         h.push(data(trie_query(a[i], ), a[i], ));
     ; i <  * m; ++i) {
         x = h.top().x, y = h.top().y, k = h.top().k;
         ) {
             ) putchar(' ');
             printf("%d", x);
         }
         h.pop();
         h.push(data(trie_query(y, k + ), y, k + ));
     }
     ;
 }

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

BZOJ3689 异或之的更多相关文章

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

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

  2. Oracle数据库异机升级

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

  3. [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 ...

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

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

  5. Poj The xor-longest Path 经典题 Trie求n个数中任意两个异或最大值

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5646   Accepted: 1226 Description In an ...

  6. RMAN异机恢复遭遇ORA-01547、ORA-01152、ORA-01110错误案例

    测试环境:     操作系统  :  Red Hat Enterprise Linux ES release 4 (Nahant Update 4)   VMWARE     数据库     :  O ...

  7. RAC异机恢复

    RAC异机恢复PDCL到PFCL: PNCL:RAC+ASM ,product env   db name:PNCL   instance:PDCL1 PDCL2 PFCL:RAC+ASM ,perf ...

  8. BZOJ 3261: 最大异或和

    Description 一个序列,支持两个操作. 1.在序列尾加入一个数. 2.询问 [l,r] 中与 x 异或值最大的数. \(n\leqslant 3*10^5\) Sol 可持久化 Trie 树 ...

  9. 异或之(bzoj 3689)

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

随机推荐

  1. 【blade04】用面向对象的方法写javascript坦克大战

    前言 javascript与程序的语言比如C#或者java不一样,他并没有“类”的概念,虽然最新的ECMAScript提出了Class的概念,我们却没有怎么用 就单以C#与Java来说,要到真正理解面 ...

  2. Unattend.xml应答文件制作(WISM)

    将制作好的应答文件unattend.xml拷贝到模板机sysprep目录下,然后在cmd下运行 (unattend.xml文件可自定义名称)   sysprep /generalize /oobe / ...

  3. js中的this指针(三)

    当一个函数并非一个对象的忏悔时,它会被当作一个函数来调用. 此时,函数中的 this 指针被绑定到了全局对象. 后果:方法不能利用内部函数来帮助工作,由于 this 被绑定了错误的值,将无法共享该方法 ...

  4. [PAT]数列求和(20)

    #include "stdio.h" #include "malloc.h" #include "math.h" void calc(int ...

  5. MYSQL 一些用法

    LOAD DATA LOCAL INFILE 'C:/xampp/htdocs/test/file/sample.csv' INTO TABLE sample1 FIELDS TERMINATED B ...

  6. 无责任Windows Azure SDK .NET开发入门篇二[使用Azure AD 进行身份验证-2.2身份验证开发]

    2.2身份验证开发 在我们的案例中,我们是用户通过Web应用程序进行身份识别. 上面的图示说明了如下的一些概念 l Azure AD 是标识提供程序,负责对组织的目录中存在的用户和应用程序的标识进行验 ...

  7. Hadoop on Mac with IntelliJ IDEA - 7 解决failed to report status for 600 seconds. Killing!问题

    本文讲述作业在Hadoop 1.2.1完成map后ruduce阶段遇到failed to report status for 600 seconds. Killing!问题的解决过程. 环境:Mac ...

  8. C#函数运行超时则终止执行(任意参数类型及参数个数通用版)

    /// <summary> /// 控制函数执行时间,超时返回null不继续执行 /// 调用方法 /// FuncTimeout.EventNeedRun action = delega ...

  9. ch02-HTML的基本概念

    HTML的基本概念 Ch02: HTML的基本概念 1, 标记: 每一组HTML标记,都会被放在"<>"里面,用于控制里面的文字显示效果及其它一些用途. 语法: 开始标 ...

  10. Java处理InterruptedException异常小结

    对于InterruptedException,一种常见的处理方式是捕捉它,然后什么也不做(或者记录下它,不过这也好不到哪去).不幸的是,这种方法忽略了这样一个事实:这期间可能发生中断,而中断可能导致应 ...