【BZOJ3689】异或之

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

4 5
1
1
3
4

Sample Output

0 2 2 5 5

HINT

【样例解释】
1 xor 1 = 0 (A[1] xor A[2])
1 xor 3 = 2 (A[1] xor A[3])
1 xor 4 = 5 (A[1] xor A[4])
1 xor 3 = 2 (A[2] xor A[3])
1 xor 4 = 5 (A[2] xor A[4])
3 xor 4 = 7 (A[3] xor A[4])
前5小的数:0 2 2 5 5
【数据范围】
 对于100%的数据,2 <= n <= 100000; 1 <= k <= min{250000, n*(n-1)/2};
        0 <= A[i] < 2^31

题解:这不就是BZOJ2006超级钢琴吗?没做过的先去做那道题。

然后这题把超级钢琴中的ST表换成可持久化Trie树就行了。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <utility>
#define mp(A,B,C,D) make_pair(make_pair(A,B),make_pair(C,D))
using namespace std;
typedef pair<int,int> pii;
priority_queue<pair<pii,pii> > pq;
const int maxn=100010;
int n,m,tot;
int ch[maxn*35][2],rt[maxn],siz[maxn*32],org[maxn*32],v[maxn];
void insert(int x,int y,int num)
{
int i,d,u;
u=rt[y]=++tot;
for(i=1<<30;i;i>>=1)
{
d=(num&i)>0;
ch[u][d]=++tot,ch[u][d^1]=ch[x][d^1],u=ch[u][d],x=ch[x][d],siz[u]=siz[x]+1;
}
org[u]=y;
}
int query(int x,int y,int num)
{
int ret=0,i,d;
for(i=1<<30;i;i>>=1)
{
d=(num&i)>0;
if(siz[ch[y][d]]==siz[ch[x][d]]) d^=1;
x=ch[x][d],y=ch[y][d];
}
return org[y];
}
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd();
int i,a,b,c,x,y;
for(i=1;i<=n;i++) v[i]=rd(),insert(rt[i-1],i,v[i]);
for(i=2;i<=n;i++) pq.push(mp(-(v[i]^v[query(0,rt[i-1],v[i])]),i,1,i-1));
pii t1,t2;
for(i=1;i<=m;i++)
{
if(i!=1) printf(" ");
t1=pq.top().first,t2=pq.top().second,pq.pop();
printf("%d",-t1.first),x=t1.second,a=t2.first,b=t2.second;
y=query(rt[a-1],rt[b],v[x]);
if(y>a) pq.push(mp(-(v[x]^v[query(rt[a-1],rt[y-1],v[x])]),x,a,y-1));
if(y<b) pq.push(mp(-(v[x]^v[query(rt[y],rt[b],v[x])]),x,y+1,b));
}
return 0;
}

【BZOJ3689】异或之 堆+可持久化Trie树的更多相关文章

  1. 【洛谷5283】[十二省联考2019] 异或粽子(可持久化Trie树+堆)

    点此看题面 大致题意: 求前\(k\)大的区间异或和之和. 可持久化\(Trie\)树 之前做过一些可持久化\(Trie\)树题,结果说到底还是主席树. 终于,碰到一道真·可持久化\(Trie\)树的 ...

  2. bzoj 3261: 最大异或和 (可持久化trie树)

    3261: 最大异或和 Time Limit: 10 Sec  Memory Limit: 512 MB Description       给定一个非负整数序列 {a},初始长度为 N.       ...

  3. BZOJ4103 [Thu Summer Camp 2015]异或运算 【可持久化trie树】

    题目链接 BZOJ4103 题解 一眼看过去是二维结构,实则未然需要树套树之类的数据结构 区域异或和,就一定是可持久化\(trie\)树 观察数据,\(m\)非常大,而\(n\)和\(p\)比较小,甚 ...

  4. 【bzoj3261】【最大异或和】可持久化trie树+贪心

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61705397 Description 给定一个非 ...

  5. BZOJ3261 最大异或和 【可持久化trie树】

    题目 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Qlrx:询问操作,你需要找到一个位置p,满 ...

  6. bzoj3261: 最大异或和 (可持久化trie树)

    题目链接 题解 看到异或和最大就应该想到01 trie树 我们记\(S_i\)为前i项的异或和 那么我们的目的是最大化\(S_n\)^\(x\)^\(S_{j-1}\) \((l <= j &l ...

  7. 『异或粽子 堆 可持久化trie』

    异或粽子 Description 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 n 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 1 到 n.第 i 种馅儿 ...

  8. 【bzoj3689】异或之 可持久化Trie树+堆

    题目描述 给定n个非负整数A[1], A[2], ……, A[n].对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这样共有n*(n ...

  9. BZOJ_3689_异或之_可持久化Trie+堆

    BZOJ_3689_异或之_可持久化Trie+堆 Description 给定n个非负整数A[1], A[2], ……, A[n]. 对于每对(i, j)满足1 <= i < j < ...

随机推荐

  1. 将ascll码转换成数值进行运算

    #include "stdlib.h"#include "stdio.h"int main() { char a[8] = { 49,32,33,61,62,6 ...

  2. 路由器漏洞复现分析第二弹:CNVD-2018-01084

    1月17日,CNVD公开了D-LinkDIR 615/645/815 service.cgi远程命令执行漏洞(CNVD-2018-01084),freebuf上有前辈写了一篇漏洞复现和poc的文章(h ...

  3. boolean类型的特殊的get和set方法

    public class D { private boolean a; public boolean isA() { return a; } public void setA(boolean a) { ...

  4. CvArr、Mat、CvMat、IplImage、BYTE转换

    一.Mat类型:矩阵类型,Matrix.     在openCV中.Mat是一个多维的密集数据数组. 能够用来处理向量和矩阵.图像.直方图等等常见的多维数据.     Mat有3个重要的方法:     ...

  5. ASP.NET MVC学习---(三)EF简单增删改查

    那么现在我们已经大概从本质上了解了ef 巴拉巴拉说了一大堆之后 总算要进入ef的正题了 总在口头说也太不行了是吧~ 没错,现在要用ef进行一些实际的操作 做什么呢? 就做一个入门级的增删改查操作吧 废 ...

  6. windows 2003子目录权限丢失及子目录权限无法继承更改的解决方法

    对于ntfs格式的分区,不当的操作方式很容易引起各种访问权限问题. 早上,给公司服务器配置网站权限,其中一个网站添加IIS_User权限删除了everyone权限后,发现网站无法访问,要求输入用户名和 ...

  7. 往MySQL数据库datetime类型字段中插入数据库的当前时间

    代码: StringBuilder sb = new StringBuilder(); sb.append(" insert into uosdetailfile ("); sb. ...

  8. JAVA Eclipse如何重新设置工作空间workspace

    窗口-首选项-常规-启动和关闭,勾选启动时提示工作空间,然后移除现有的工作空间,最好也勾选启动时刷新工作空间   重启之后就可以设置工作空间了  

  9. Javascript中的回调函数和匿名函数的回调

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. Java-帮助文档的制作

    Java-帮助文档的制作 1,public修饰的类才干够用bin/javadoc生成文档 2.java的说明书是通过文档的凝视来完毕的,所以在敲代码的时候.凝视是非常有必要的 使用文档凝视法,才干够生 ...