BZOJ3689 异或之
我们需要知道一个事实,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 异或之的更多相关文章
- bzoj2006 [NOI2010]超级钢琴 (及其拓展)
bzoj2006 [NOI2010]超级钢琴 给定一个序列,求长度在 \([L,\ R]\) 之间的区间和的前 \(k\) 大之和 \(n\leq5\times10^5,\ k\leq2\times1 ...
- HBSX2019 游记
Day -4 训练戳SX2019 3月训练 ZJOI2019 Day1几天前就考了 T1真考了麻将QwQ 九条可怜的毒瘤真的是业界良心 今天中午才起,要开始调整生物钟了 9012HBOIers群里讨论 ...
- [您有新的未分配科技点]可,可,可持久化!?------0-1Trie和可持久化Trie普及版讲解
这一次,我们来了解普通Trie树的变种:0-1Trie以及在其基础上产生的可持久化Trie(其实,普通的Trie也可以可持久化,只是不太常见) 先简单介绍一下0-1Trie:一个0-1Trie节点只有 ...
- 【BZOJ3689】异或之 堆+可持久化Trie树
[BZOJ3689]异或之 Description 给定n个非负整数A[1], A[2], ……, A[n].对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A ...
- 【bzoj3689】异或之 可持久化Trie树+堆
题目描述 给定n个非负整数A[1], A[2], ……, A[n].对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这样共有n*(n ...
- Android数据加密之异或加密算法
前言: 这几天被公司临时拉到去做Android IM即时通信协议实现,大致看了下他们定的协议,由于之前没有参与,据说因服务器性能限制,只达成非明文传递,具体原因我不太清楚,不过这里用的加密方式是采用异 ...
- Oracle数据库异机升级
环境: A机:RHEL5.5 + Oracle 10.2.0.4 B机:RHEL5.5 需求: A机10.2.0.4数据库,在B机升级到11.2.0.4,应用最新PSU补丁程序. 目录: 一. 确认是 ...
- [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 ...
- [PHP][位转换积累]之异或运算的简单加密应用
异或的符号是^.按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0. xor运算的逆运算是它本身,也就是说两次异或同一个数 ...
随机推荐
- monkey基本命令参数详解示例
Monkey基本命令参数 参数名 基本功能 举例 -p 参数-p用于约束限制,用此参数指定一个或多个包(Package,即App).指定 包之后,Monkey将只允许系统启动指定的APP.如果不指定包 ...
- C/C++内存泄漏及检测 转
C/C++内存泄漏及检测 2011-02-20 17:51 by 吴秦, 30189 阅读, 13 评论, 收藏, 编辑 “该死系统存在内存泄漏问题”,项目中由于各方面因素,总是有人抱怨存在内存泄漏, ...
- iOS - OC NSUserDefaults 数据存储
前言 @interface NSUserDefaults : NSObject 用来保存应用程序设置和属性.用户保存的数据.用户再次打开程序或开机后这些数据仍然存在.如果往 userDefaults ...
- 一切都是对象 Thinking in Java 第二章
2.1 用引用操作对象 1.对象和引用联系起来,就可以通过引用来操作对象: 2.引用亦可单独存在,即没有和任何对象联系起来:对没有和对象联系起来的引用操作,会报错: 2.2 必须由你创建所有对象 1. ...
- [转载] tmux的使用tips
原文: http://tangosource.com/blog/a-tmux-crash-course-tips-and-tweaks/
- Python学习(6)循环语句
目录 Python循环语句 - while循环语句 -- 无线循环 -- 循环使用else语句 -- 简单语句组 - for循环语句 -- 通过序列索引迭代 -- 循环使用else语句 - 循环嵌套 ...
- python 标准库
https://www.zhihu.com/question/24590883 https://www.zhihu.com/question/20501628 http://blog.csdn.net ...
- 【转载】C++异常机制的学习
参考了这篇文章:http://blog.chinaunix.net/uid-24517549-id-4079174.html 关于线程 进程和线程的概念相信各位看官早已耳熟能详.在这里,我只想带大家回 ...
- c time_t 和 oc NSDate 的转换
c time_t 和 oc NSDate 的转换 1:time_t 转 oc NSDate time_t some_time_t=NULL; NSDate *someDate = [NSDate da ...
- crontab在一秒内刷新多次导致部分脚本不生效的问题分析
版权声明:本文由康中良原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/182 来源:腾云阁 https://www.qclo ...