字典树可以$o(logn)查找第k大$

使用$可持久化Trie 区间查找第k大,然后首先把每个数异或之后的最小丢进小根堆中,然后一个一个取出,取出后就再丢次小,一共取k次$

总的时间复杂度为$O(klogn)$

本来的考虑是 先找出第k大,然后在$Trie上DFS把小于这个数的全丢进vector  然后发现会有很多无用状态会搜索到,T掉$

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define N 100010
  5. int n, k, arr[N], kth;
  6. struct node
  7. {
  8. int base, num, pos, l, r;
  9. node () {}
  10. node (int base, int num, int pos, int l, int r) : base(base), num(num), pos(pos), l(l), r(r) {}
  11. bool operator < (const node &r) const { return num > r.num; }
  12. };
  13. priority_queue <node> q;
  14.  
  15. namespace TRIE
  16. {
  17. int rt[N], cnt;
  18. struct node
  19. {
  20. int son[], cnt;
  21. }a[N * ];
  22. void init()
  23. {
  24. a[].son[] = a[].son[] = a[].cnt = ;
  25. cnt = ;
  26. }
  27. void insert(int &now, int pre, int x)
  28. {
  29. now = ++cnt;
  30. a[now] = a[pre];
  31. int root = now; ++a[root].cnt;
  32. for (int i = ; i >= ; --i)
  33. {
  34. int id = (x >> i) & ;
  35. a[++cnt] = a[a[root].son[id]];
  36. ++a[cnt].cnt;
  37. a[root].son[id] = cnt;
  38. root = cnt;
  39. }
  40. }
  41. int find_kth(int x, int k, int l, int r)
  42. {
  43. int res = ;
  44. int tl = rt[l], tr = rt[r];
  45. for (int s = ; s >= ; --s)
  46. {
  47. int id = (x >> s) & ;
  48. int sum = a[a[tr].son[id]].cnt - a[a[tl].son[id]].cnt;
  49. if (sum < k)
  50. {
  51. k -= sum;
  52. res |= << s;
  53. tr = a[tr].son[id ^ ];
  54. tl = a[tl].son[id ^ ];
  55. }
  56. else
  57. {
  58. tr = a[tr].son[id];
  59. tl = a[tl].son[id];
  60. }
  61. }
  62. return res;
  63. }
  64. }
  65.  
  66. int main()
  67. {
  68. while (scanf("%d%d", &n, &k) != EOF)
  69. {
  70. for (int i = ; i <= n; ++i) scanf("%d", arr + i);
  71. TRIE::init();
  72. for (int i = ; i <= n; ++i) TRIE::insert(TRIE::rt[i], TRIE::rt[i - ], arr[i]);
  73. for (int i = ; i < n; ++i) q.push(node(arr[i], TRIE::find_kth(arr[i], , i, n), , i, n));
  74. for (int i = ; i <= k; ++i)
  75. {
  76. node top = q.top(); q.pop();
  77. printf("%d%c", top.num, " \n"[i == k]);
  78. q.push(node(top.base, TRIE::find_kth(top.base, top.pos, top.l, top.r), top.pos + , top.l, top.r));
  79. }
  80. }
  81. return ;
  82. }

BZOJ 3689: 异或之的更多相关文章

  1. bzoj 3689: 异或之 Trie+堆

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3689 题解: 利用一个优先队列存储当前取到的数 然后再写一颗支持查找异或的k大值的Tri ...

  2. BZOJ 3689 异或 Trie木+堆

    标题效果:特定n的数量,这种需求n数22 XOR的值前者k少 首先,我们建立了一个二进制的所有数字Trie木,您可以使用Trie木size域检查出一些其他的数字XOR值首先k少 然后,我们要保持一个堆 ...

  3. BZOJ 3689 异或之 (可持久化01Trie+堆)

    题目大意:给你一个序列,求出第$K$大的两两异或值 先建出来可持久化$01Trie$ 用一个$set$/堆存结构体,存某个异或对$<i,j>$的第二关键字$j$,以及$ai\;xor\;a ...

  4. BZOJ 3689: 异或之 可持久化trie+堆

    和超级钢琴几乎是同一道题吧... code: #include <bits/stdc++.h> #define N 200006 #define ll long long #define ...

  5. 异或之(bzoj 3689)

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

  6. [BZOJ 4671]异或图

    Description 题库链接 给定 \(s\) 个结点数相同且为 \(n\) 的图 \(G_1\sim G_s\) ,设 \(S = \{G_1, G_2,\cdots , G_s\}\) ,问 ...

  7. BZOJ 4671 异或图 | 线性基 容斥 DFS

    题面 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中 ...

  8. bzoj 2466 异或方程组

    对于每个灯,我们用一个变量表示其决策,xu=0表示不选,xu=1表示选.因为每个灯最后必须都亮,所以每个等都对应一个异或方程. 解这个异或方程组,有几种情况: 1.存在唯一解(得到的上三角系数矩阵的主 ...

  9. bzoj 4671 异或图——容斥+斯特林反演+线性基

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4671 考虑计算不是连通图的方案,乘上容斥系数来进行容斥. 可以枚举子集划分(复杂度是O(Be ...

随机推荐

  1. 亿级日PV的魅族云同步的核心协议与架构实践

    声明:本文根据msup和魅族联合举办的<第三期魅族技术开放日-架构设计与优化>录音整理原创首发,转载或节选内容前需获授权. 嘉宾:沈辉煌,魅族高级架构师,魅族云同步负责人.2010年加入魅 ...

  2. eclipse 下安装 lombok.jar

    lombok是一个java 开发插件,可以用来简化代码, 1. 下载lombok.jar https://projectlombok.org/download 2 将lombok.jar文件放在ecl ...

  3. Wise 打包细节

    细节 说明 添加卸载快捷方式 缺省的安装程序快捷方式中没有卸载项:只能通过控制面板删除,或者主程序目录下的UnWise.exe来卸载.实际上,该文件就可以作为卸载程序. 可以复制一个快捷方式,将程序名 ...

  4. WPF MVVM(Caliburn.Micro) 数据验证

    书接前文 前文中仅是WPF验证中的一种,我们暂且称之为View端的验证(因为其验证规是写在Xaml文件中的). 还有一种我们称之为Model端验证,Model通过继承IDataErrorInfo接口来 ...

  5. plsql类型

    --plsql基本数据类型1.标量类型1.1数字型--BINARY_INTEGER 来存储有符号整数.它的范围是-2**31至2**31.跟PLS_INTEGER一样,BINARY_INTEGER所需 ...

  6. DBUtils结果集处理

    1.BeanHandler查询 package jdbc; import java.sql.Connection; import java.sql.SQLException; import org.a ...

  7. ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]

    今天第一次遇到Failed to start component [StandardEngine[Catalina].StandardHost[localhost].错误,并且在错误提示的后半段出现了 ...

  8. django 之 常用命令

    Django 基本命令 本节主要是为了让您了解一些django最基本的命令,请尝试着记住它们,并且多多练习下 1. 新建一个 django project django-admin.py startp ...

  9. border-radius 原理分析

    border-radius 想必大家都有所了解,比较常见的用法就像下面一样: 注意左边的盒子 border-radius: 100px;  右边的为0哦,所以右边的实际上没有设置圆角边框属性:咱们比较 ...

  10. c# Log4net的结构

    log4net 有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及 Layout(布局).