题解:类似与超级钢琴的做法 直接用堆维护即可  (

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <cmath>
#include <set>
#include <map>
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define link(x) for(edge *j=h[x];j;j=j->next)
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
const int MAXN=3e5+10;
const double eps=1e-8;
#define ll long long
using namespace std;
struct edge{int t,v;edge*next;}e[MAXN<<1],*h[MAXN],*o=e;
void add(int x,int y,int vul){o->t=y;o->v=vul;o->next=h[x];h[x]=o++;}
ll read(){ll x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return x*f;
}
int n,k,cnt;
int a[MAXN],rt[MAXN],tag[MAXN*32];
typedef struct node{int l,r,sum;
}node;
node d[MAXN*32];
void insert(int x,int k,int id){for(int i=30;i>=0;i--){if(k&(1<<i)){int t=++cnt;d[t]=d[d[x].r];d[x].r=t;d[t].sum++;x=t;}else{int t=++cnt;d[t]=d[d[x].l];d[x].l=t;d[t].sum++;x=t;}}tag[x]=id;
}
pair<int,int> querty(int x,int y,int k){int res=0;for(int i=30;i>=0;i--){if(k&(1<<i)){if(d[d[y].r].sum-d[d[x].r].sum)res+=(1<<i),x=d[x].r,y=d[y].r;else x=d[x].l,y=d[y].l;}else{if(d[d[y].l].sum-d[d[x].l].sum)x=d[x].l,y=d[y].l;else res+=(1<<i),x=d[x].r,y=d[y].r;}}res^=k;return mp(tag[y],res);
}
typedef struct Tmp{int pos,l,r,key,aim;friend bool operator<(Tmp aa,Tmp bb){return aa.key>bb.key;}
}Tmp;
priority_queue<Tmp>que;
vector<int>vec;
int main(){n=read();k=read();cnt=0;rt[0]=++cnt;insert(rt[0],0,0);inc(i,1,n)a[i]=read(),rt[i]=++cnt,d[rt[i]]=d[rt[i-1]],insert(rt[i],a[i],i);inc(i,2,n){pair<int,int> t=querty(rt[0],rt[i-1],a[i]);que.push((Tmp){t.first,1,i-1,t.second,i});}pair<int,int> t1;for(int i=1;i<=k;i++){vec.pb((que.top()).key);Tmp t=que.top();que.pop();printf("%d ",t.key);if(t.pos>t.l)t1=querty(rt[t.l-1],rt[t.pos-1],a[t.aim]),que.push((Tmp){t1.first,t.l,t.pos-1,t1.second,t.aim});if(t.pos<t.r)t1=querty(rt[t.pos],rt[t.r],a[t.aim]),que.push((Tmp){t1.first,t.pos+1,t.r,t1.second,t.aim});}
}

  

3689: 异或之

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 550  Solved: 269
[Submit][Status][Discuss]

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

转载于:https://www.cnblogs.com/wang9897/p/9723096.html

BZOJ3689: 异或之相关推荐

  1. [您有新的未分配科技点]可,可,可持久化!?------0-1Trie和可持久化Trie普及版讲解...

    这一次,我们来了解普通Trie树的变种:0-1Trie以及在其基础上产生的可持久化Trie(其实,普通的Trie也可以可持久化,只是不太常见) 先简单介绍一下0-1Trie:一个0-1Trie节点只有 ...

  2. 不占用多余空间实现值的交换——异或运算

    首先什么是异或运算? ^规则: 0 ^ x = x x ^ x = 0 那么 a 与 b 交换值如何做呢???三行代码

  3. 左神讲算法——异或的高级操作(两数交换+经典面试题)

    目录 1. 异或的性质 2. 两数交换 3. 经典面试例题 参考链接:2021最新左神数据结构算法全家桶 1. 异或的性质 异或可以看成相同为1,不同为0:也可以看作无进位相加,有奇数个1则结果为1, ...

  4. 《The Sixth Sense》(《灵异第六感》)观后

    记得在学校的时候看过一部片子<左眼看到鬼>,现在想想那部片子有抄袭<Tht Sixth Sense>的嫌疑.不过抄袭也差得远. 现在真的懒得看港台片了,国内的农村,山村题材的都 ...

  5. 计算机入门新人必学,异世修真人怎么玩?新手快速入门必备技巧

    异世修真人怎么快速入门?最近新出来的一款文字修仙游戏,很多萌新不知道怎么玩?进小编给大家带来了游戏新手快速入门技巧攻略,希望可以帮到大家. 新手快速入门攻略 1.开局出来往下找婆婆,交互给点钱,旁边有 ...

  6. java 异或_Java之超级基础且实用的知识点

    1月20日 今天是小编的寒假的第一天!忙碌家里的事忙了一上午~下午困着但是不学习会心里难受.(毕竟是立下了寒假Flag的人)然后就打开了电脑,我发现我这个人,生活中不洁癖,但学习上还是有点洁癖的,这不 ...

  7. 136. 只出现一次的数字(关于异或的使用)

    136. 只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现 ...

  8. 【bzoj3261】最大异或和 可持久化Trie树

    题目描述 给定一个非负整数序列 {a},初始长度为 N.        有M个操作,有以下两种操作类型: 1.A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1. 2.Q l r x: ...

  9. 【GDKOI2016Day1T1-魔卡少女】【拆位】线段树维护区间内所有连续子区间的异或和...

    题意:给出N个数,M个操作.操作有修改和询问两种,每次修改将一个数改成另一个数,每次询问一个区间的所有连续子区间的异或和.n,m<=100000,ai<=1000 题解: 当年(其实也就是 ...

  10. oracle rman异机恢复

      Oracle源主机 Oracle目标主机 主机平台 CentOS6.2(final) CentOs6.2(FInal) 主机名 vick rman IP地址 192.168.1.11 192.16 ...

最新文章

  1. centos7下安装intel Media Server Studio记录
  2. Ubuntu 16.04重启输入法
  3. python3 使用 socket.gethostbyname 报错 getaddrinfo failed 解决方法
  4. Java之IO流学习总结【上】
  5. KubeVela 成为 CNCF 沙箱项目,让云端应用交付更加简单
  6. python 港股交易数据_GitHub - 116pythonZS/futuquant: 富途量化平台 API
  7. Gazebo仿真平台
  8. antd 使用upload 组件,使用自定义上传行为,覆盖默认action 访问请求
  9. Setup Factory 安装程序的图标
  10. ajax 的data,ajax请求的data数据格式
  11. html图片滚动红点_程序员最爱的小红点更新了!史上最薄的钛制ThinkPad发布
  12. 汉诺塔游戏程序可以通过“递归”来实现?但你未必清楚其根本原因。
  13. 千博日志索引,收录了带头大哥、laok、王国强、严为民等人的博客
  14. Thymeleaf 教程
  15. 极速加密文件夹: 一个2秒加密文件夹的Windows文件夹加密软件
  16. 时间搓转换剩余时间 php
  17. 微信测试睡眠的软件,微信小睡眠小程序使用方法
  18. Font Awesome 的使用
  19. android 系统自带的软件可以删除列表--Defy
  20. linux中的 inode 详解

热门文章

  1. 计算机主板自动重启,我电脑关机后总是自动重启,主板换了
  2. 海报生成的Java方法
  3. MAC系统中安装labelme
  4. 如何卸载冰点还原精灵
  5. 什么是HD , HDTV , BD(Blu-Ray) , HDDVD
  6. python股市回测程序
  7. ftp文件服务器怎么迁移,ftp文件服务器迁移
  8. excel中去重计数_在Excel中计数
  9. 592. Fraction Addition and Subtraction
  10. 电信行业数据安全风险评估案例 - 数据安全治理之数据安全风险评估白皮书