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运算的逆运算是它本身,也就是说两次异或同一个数 ...
随机推荐
- Java——FIle:
1.读取文件夹中的文件 /** * 读取图片文件 * @param imgPath 文件所在的文件夹绝对路径 * @return * @throws FileNotFoundException */ ...
- OnClientClick的用法
摘自:http://blog.csdn.net/coolpig86/article/details/5439560 OnClientClick用于执行客户端脚本.当我们单击一个按钮时,最先执行的是On ...
- CSharp Similarities and Differences
This document lists some basic differences between Nemerle and C# in a terse form. If you know Java ...
- 利用JDK的中Proxy动态代理实现Spring的AOP技术
首先给出设计模式静态代理与动态代理的学习: http://layznet.iteye.com/blog/1182924 讲的不错 然后我们实现AOP 就要求我们对委托的所有方法的调用实现拦截 代理 ...
- JSP学习——语法
JSP模版元素 JSP表达式 JSP脚本片断 JSP注释JSP指令JSP标签 JSP内置对象如何查找JSP页面中的错误 1:JSP模版元素 : JSP页面中的HTML内容称之为JSP模版元素. JSP ...
- 保留ip: Reserved IP addresses
Reserved IP addresses From Wikipedia, the free encyclopedia In the Internet addressing architect ...
- 高处胜寒 php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法
<?php /* * 经典的概率算法, * $proArr是一个预先设置的数组, * 假设数组为:array(100,200,300,400), * 开始是从1,1000 这个概率范围内筛选第一 ...
- thinkphp分页效果的制作,按查询条件分页正确做法
PHP代码: <?php namespace Home\Controller; use Think\Controller; use Home\Clas\Cate; class IndexCont ...
- Path,Files巩固,题目:从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
这个题目用传统的File,InputStream可以做,但是如果用Files,Path类做,虽然思路上会困难一些,但是代码简洁了很多,以下是代码: import java.io.IOException ...
- Android Fragment分页显示的实现
分页显示有两种方式 一种是使用ViewPager 另一种是使用FragmentTransaction 上代码 1 FragmentTransaction实现方式 public class MainAc ...