BZOJ_3689_异或之_可持久化Trie+堆
BZOJ_3689_异或之_可持久化Trie+堆
Description
给定n个非负整数A[1], A[2], ……, A[n]。
对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这样共有n*(n-1)/2个新的数。求这些数(不包含A[i])中前k小的数。
注:xor对应于pascal中的“xor”,C++中的“^”。
Input
第一行2个正整数 n,k,如题所述。
以下n行,每行一个非负整数表示A[i]。
Output
共一行k个数,表示前k小的数。
Sample Input
1
1
3
4
Sample Output
0 2 2 5 5
类似超级钢琴那道题,只不过这道题需要求一个数和区间内某数异或的最小值。
于是我们对前缀建立可持久化Trie,直接Trie树上贪心即可。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <ext/pb_ds/priority_queue.hpp>
using namespace std;
using namespace __gnu_pbds;
#define N 100050
inline char nc() {
static char buf[100000],*p1,*p2;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int rd() {
register int x=0; register char s=nc();
while(s<'0'||s>'9') s=nc();
while(s>='0'&&s<='9') x=(x<<3)+(x<<1)+s-'0',s=nc();
return x;
}
struct A {
int x,p,l,r,v;
A() {}
A(int x_,int p_,int l_,int r_,int v_) :
x(x_),p(p_),l(l_),r(r_),v(v_) {}
};
int a[N],n,K,end[N*35];
inline bool operator < (const A &x,const A &y) {
return x.v>y.v;
}
__gnu_pbds::priority_queue<A>q;
int root[N],ch[N*35][2],siz[N*35],cnt=1;
void insert(int k) {
int i;
root[k]=++cnt;
int p=root[k],q=root[k-1];
siz[p]=siz[q]+1;
for(i=31;i>=1;i--) {
int t=((a[k]>>(i-1))&1);
ch[p][!t]=ch[q][!t];
ch[p][t]=++cnt;
p=ch[p][t];
q=ch[q][t];
siz[p]=siz[q]+1;
}
end[p]=k;
}
int query(int l,int r,int x) {
int p=root[l-1],q=root[r],i,pos;
for(i=31;i>=1;i--) {
int t=((x>>(i-1))&1);
if(siz[ch[q][t]]-siz[ch[p][t]]) {
p=ch[p][t]; q=ch[q][t];
}else {
p=ch[p][!t]; q=ch[q][!t];
}
}
return end[q];
}
void solve() {
int i;
for(i=1;i<n;i++) {
int t=query(i+1,n,a[i]);
q.push(A(i,t,i+1,n,a[i]^a[t]));
}
for(i=1;i<=K;i++) {
A t=q.top(); q.pop();
//printf("%d %d\n",t.x,t.p);
printf("%d ",a[t.x]^a[t.p]);
int d;
if(t.p>t.l) d=query(t.l,t.p-1,a[t.x]),q.push(A(t.x,d,t.l,t.p-1,a[d]^a[t.x]));
if(t.p<t.r) d=query(t.p+1,t.r,a[t.x]),q.push(A(t.x,d,t.p+1,t.r,a[d]^a[t.x]));
}
}
int main() {
n=rd(); K=rd();
int i;
for(i=1;i<=n;i++) {
a[i]=rd();
insert(i);
}
solve();
}
BZOJ_3689_异或之_可持久化Trie+堆的更多相关文章
- BZOJ_3261_最大异或和_可持久化trie
BZOJ_3261_最大异或和_可持久化trie Description 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x, ...
- Luogu5283 十二省联考2019异或粽子(trie/可持久化trie+堆)
做前缀异或和,用堆维护一个五元组(x,l,r,p,v),x为区间右端点的值,l~r为区间左端点的范围,p为x在l~r中最大异或和的位置,v为该最大异或和,每次从堆中取出v最大的元素,以p为界将其切成两 ...
- [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】
题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF ...
- 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)
LOJ 洛谷 考场上都拍上了,8:50才发现我读错了题=-= 两天都读错题...醉惹... \(Solution1\) 先求一遍前缀异或和. 假设左端点是\(i\),那么我们要在\([i,n]\)中找 ...
- bzoj 3261: 最大异或和 (可持久化trie树)
3261: 最大异或和 Time Limit: 10 Sec Memory Limit: 512 MB Description 给定一个非负整数序列 {a},初始长度为 N. ...
- Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)
题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...
- 【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)
4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 474 Solved: 258 De ...
- BZOJ4103 [Thu Summer Camp 2015]异或运算 【可持久化trie树】
题目链接 BZOJ4103 题解 一眼看过去是二维结构,实则未然需要树套树之类的数据结构 区域异或和,就一定是可持久化\(trie\)树 观察数据,\(m\)非常大,而\(n\)和\(p\)比较小,甚 ...
- 【洛谷 P4735】 最大异或和 (可持久化Trie)
题目链接 维护整个数列的异或前缀和和\(s\),然后每次就是要求\(s[N]\text{^}x\text{^}s[k],l-1<=k<=r-1\)的最大值 如果没有\(l\)的限制,那么直 ...
随机推荐
- iOS 博客资源精选
摘要:记录一些网上非常牛的人写的博文.收藏起来. 以备日后需要时学习备用. 1:iOS中UIWebView的Javascript与Objective-C通信 http://imchao.net/201 ...
- redis主从,哨兵回忆手册
redis主从 持久化的开启与主从集群是否生效无关系 Slave Server同样是以非阻塞的方式完成数据同步.在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据(注意初次同步则会阻 ...
- 2013-9百度技术沙龙:Clouda与nodejs
Clouda 云端一体设计思路 目前的App推广由于渠道原因非常难 Clouda是用Web技术做的移动App的框架 实时在线将会启动一批新需求 线下数据线上实时化 本地存储Merge 面向数据的开发方 ...
- 与班尼特·胡迪一起做生意 (HZUN-2261)
与班尼特·胡迪一起做生意 AC Time Limit: 1 s Memory Limit: 256 MB Description 马爷作为2-80X的资深土财主,靠着敏锐的商业嗅觉不断 ...
- [开源]基于ffmpeg和libvlc的视频剪辑、播放器
[开源]基于ffmpeg和libvlc的视频剪辑.播放器 以前研究的时候,写过一个简单的基于VLC的视频播放器.后来因为各种项目,有时为了方便测试,等各种原因,陆续加了一些功能,现在集成了视频播放.视 ...
- Python3实现ICMP远控后门(上)_补充篇
ICMP后门(上)补充篇 前言 在上一篇文章Python3实现ICMP远控后门(上)中,我简要讲解了ICMP协议,以及实现了一个简单的ping功能,在文章发表之后,后台很多朋友留言,说对校验和的计算不 ...
- Qt5.7 实现Https 认证全过程解析(亲自动手版)
#### NetworkRequestManager.h #include <QSsl>#include <QSslKey>#include <QSslSocket> ...
- JQuery(三)-- AJAX的深入理解以及JQuery的使用
HTTP HTTP http: 超文本传输协议.特点: 简单.快速.灵活.无状态.无连接 URL: 统一资源定位符. 组成:协议名://主机IP:端口号/项目资源地址?传递参数的键值对#锚点 ①ip ...
- Python_替换当前目录下文件类型
''' 将当前目录的所有扩展名为html的文件重命名为扩展名为htm的文件 方法一 ''' import os file_list=os.listdir('.') for filename in fi ...
- sniffer pro 使用方法
一.捕获数据包前的准备工作 在默认情况下,sniffer将捕获其接入碰撞域中流经的所有数据包,但在某些场景下,有些数据包可能不是我们所需要的,为了快速定位网络问题所在,有必要对所要捕获的数据包作过滤. ...