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运算的逆运算是它本身,也就是说两次异或同一个数 ...
随机推荐
- DICOM标准相关资料
由于需要阅读影像,对DICOM需要先熟悉起来.关于DICOM,找了一些资料,可以学习.如下: DICOM标准:http://dicom.nema.org/standard.html 中文 DICOM ...
- LightOJ::1077 -----奇妙的最大公约数
题目:http://www.lightoj.com/volume_showproblem.php?problem=1077 题意:在平面上, 给出两个点的坐标 例如:(x, y) 其中x, y 都是整 ...
- iOS - OC NSString 字符串
前言 @interface NSString : NSObject <NSCopying, NSMutableCopying, NSSecureCoding> @interface NSM ...
- 漫谈 Greenplum 开源背后的动机
漫谈 Greenplum 开源背后的动机 Greenplum是一家总部位于美国加利福尼亚州,为全球大型企业用户提供新型企业级数据仓库(EDW).企业级数据云(EDC)和商务智能(BI)提供解决方案和 ...
- c++ 操作符 重载。
操作符如关系操作符,全局函数的话,必须第一个是class. 1.赋值(=),下标([ ]),调用(())和成员访问箭头(->)等操作符必须定义为成员,如果定义为非成员的话,程序在编译的时候,会发 ...
- Nexus4_文件名乱码
1. 官方的出厂映像 for Android4.4:occam-krt16s-factory-2006f418.tgz 2. 自己编译的 Android-4.4_r1 (AOSP on Mako) 映 ...
- 线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯
1.Lock相关知识介绍 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是哪块先熟了,先收割哪块. 下面举一个面试题的例子来引出Lock缓存读写锁的案例,一个load()和get()方法返回值 ...
- linux install sublime_text3
ubuntu & debian: (baidu or google) 1). download ***.deb to install inux系统下怎么安装.deb文件? deb 是 ubun ...
- 关于mysql的基础知识
一.数据库的简介 什么是数据库? 数据的仓库,如:在atm的实例中我们创建一个db目录称之为数据库 什么是 MySQL.Oracle.SQLite.Access.MS SQL Server等 ? 他们 ...
- iOS开发之Xcode 6 国际化
Xcode6 国际化 (1) 新建一个Single View app模版项目,命名为LocalizationTest 1.建立strings文件,命名为Localization.strings 2.点 ...