博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj3689
阅读量:5037 次
发布时间:2019-06-12

本文共 1502 字,大约阅读时间需要 5 分钟。

trie+堆

跟超级钢琴是一个想法

我们先把每个数插进trie里,然后对于每个数查找异或第二小,因为第一小肯定是和自己。

然后就和超级钢琴一样,从堆里取出,插入第k+1小。trie是可以查找第k小的,只要维护一个size。

#include
using namespace std;const int N = 100010, mod = 1000000007;struct data { int v, p, rank; data(int v = 0, int p = 0, int rank = 0) : v(v), p(p), rank(rank) {} friend bool operator < (data A, data B) { return A.v > B.v; }};priority_queue
q;int ans, n, m;int a[N], bit[30];struct trie { int cnt, root; int size[N * 26], child[N * 25][2]; void insert(int &x, int val, int bit) { if(!x) x = ++cnt; ++size[x]; if(bit < 0) return; int t = (val >> bit) & 1; insert(child[x][t], val, bit - 1); } int query(int x, int val, int k, int bit) { if(bit < 0) return 0; int t = (val >> bit) & 1; if(size[child[x][t]] >= k) return query(child[x][t], val, k, bit - 1); else return query(child[x][t ^ 1], val, k - size[child[x][t]], bit - 1) + (1 << bit); }} t;int main(){ scanf("%d%d", &n, &m); m *= 2; for(int i = 1; i <= n; ++i) { scanf("%d", &a[i]); t.insert(t.root, a[i], 30); } for(int i = 1; i <= n; ++i) q.push(data(t.query(t.root, a[i], 2, 30), i, 2)); for(int i = 1; i <= m; ++i) { data x = q.top(); q.pop(); if(i & 1) printf("%d ", x.v); q.push(data(t.query(t.root, a[x.p], x.rank + 1, 30), x.p, x.rank + 1)); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/19992147orz/p/7106668.html

你可能感兴趣的文章
where,having与 group by连用的区别
查看>>
【MySQL】MySQL锁和隔离级别浅析二 之 INSERT
查看>>
Oracle T4-2 使用ILOM CLI升级Firmware
查看>>
4.14上午
查看>>
数据分析 -- 白话一下什么是决策树模型(转载)
查看>>
Java SPI机制原理和使用场景
查看>>
web前端java script学习2017.7.18
查看>>
删除TXPlatform
查看>>
LaTex:图片排版
查看>>
并发访问超时的问题可能性(引用)
查看>>
中小团队基于Docker的Devops实践
查看>>
利用python打开摄像头并保存
查看>>
System函数的使用说明
查看>>
Selenium-测试对象操作之:获取浏览器滚动条滚动距离
查看>>
Linux下MySQL数据库安装与配置
查看>>
Extjs String转Json
查看>>
oracle入门(4)——少而常用的命令
查看>>
打印机设置(PrintDialog)、页面设置(PageSetupDialog) 及 RDLC报表如何选择指定打印机...
查看>>
Java 虚拟机部分面试题
查看>>
二叉树的遍历问题总结
查看>>