题面

题目描述

给定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++中的“^”。

输入

第一行2个正整数 n,k,如题所述。
以下n行,每行一个非负整数表示A[i]。

输出

共一行k个数,表示前k小的数。

样例输入

4 5
1
1
3
4

样例输出

0 2 2 5 5

【样例解释】

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

题解

堆 + trie.
首先明确, trie树上可以找到一个数的xor第k大(小).
我们把每个数的异或第\(2\)小先装进堆里面(异或第\(1\)小是自己异或自己, 不在题目考虑范围内), 每次取出堆头, 假设堆头是第\(p\)小, 则插入第\(p + 1\)小即可.
注意应该取\(2k\)次, 因为每两次得到的结果是相同的.

#include <cstdio>
#include <cctype>
#include <queue>namespace Zeonfai
{inline int getInt(){int a = 0, sgn = 1;char c;while(! isdigit(c = getchar()))if(c == '-')sgn *= -1;while(isdigit(c))a = a * 10 + c -'0', c = getchar();return a * sgn;}inline void print(int a){if(! a)return;print(a / 10);putchar(a % 10 + '0');}inline void println(int a){if(a < 0)putchar('-'), a *= -1;if(a == 0)putchar('0');print(a);putchar(' ');}
}const int N = 100000;struct trieTree
{struct node{node *suc[2];int cnt;inline node(){suc[0] = suc[1] = NULL;cnt = 0;}};node *rt;inline trieTree(){rt = new node;}inline void insert(int w){node *u = rt;for(int i = 30; ~ i; -- i){int k = w >> i & 1;if(u->suc[k] == NULL)u->suc[k] = new node;++ (u = u->suc[k])->cnt;}}inline int query(int w, int k){node *u = rt;int res = 0;for(int i = 30; ~ i; -- i){int tmp = w >> i & 1;if(u->suc[tmp] != NULL && u->suc[tmp]->cnt >= k)u = u->suc[tmp];elsek -= u->suc[tmp] == NULL ? 0 : u->suc[tmp]->cnt, u = u->suc[tmp ^ 1], res += 1 << i;}return res;}
}trie;struct record
{int id, k, w;inline record(int _id, int _k ,int _w){id = _id, k = _k, w = _w;}inline int friend operator <(record a, record b){return a.w > b.w;}
};int main()
{#ifndef ONLINE_JUDGEfreopen("BZOJ3689.in", "r", stdin);#endifusing namespace Zeonfai;int n = getInt(), k = getInt();static int a[N];for(int i = 0; i < n; ++ i)trie.insert(a[i] = getInt());static std::priority_queue<record> hp;for(int i = 0; i < n; ++ i)hp.push(record(i, 2, trie.query(a[i], 2)));for(int i = 0; i < k << 1; ++ i){record res = hp.top();hp.pop();if(i & 1)println(res.w);if(res.k < n)hp.push(record(res.id, res.k + 1, trie.query(a[res.id], res.k + 1)));}
}

转载于:https://www.cnblogs.com/ZeonfaiHo/p/7115232.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. Java中如何实现j并发更新数据库同一条数据
  2. 项目: 用C语言写一个音乐播放器
  3. 本文将向您展示如何在 Flutter 中编码/解码 JSON
  4. Head First JSP---随笔六
  5. codematic2连接mysql失败_codematic2.rar
  6. c语言编程游戏开代码错误,[蓝桥杯][历届试题]数字游戏 (C语言代码)(兄弟们帮我看一下为什么运行错误86%)...
  7. php 备份数据库 Backup Your MySQL Database Using PHP
  8. 微课系列(8):Python中lambda表达式的变量作用域
  9. 根据输入汉字获取其全拼及简拼
  10. NOAA气象日监测数据均值计算python代码整理
  11. VsCode中文乱码问题
  12. 机械师笔记本电脑使用小常识
  13. html改变按钮形状6,6个HTML5/CSS3按钮悬停边界旋绕动画
  14. ar vr mr 计算机技术,VR技术是什么?AR、MR又是什么?
  15. PyCharm-professional-2016.2.3注册码
  16. 锐捷多网卡问题破解-----过河拆桥解决完整性校验
  17. 2022年蓝桥杯:第十三届蓝桥杯大赛软件赛省赛(全部正解做法代码 C/C++ B组)
  18. CDN是什么?为什么要使用CDN?
  19. Invalid array length
  20. c++关键字virtual的用法(面试)

热门文章

  1. STM32单片机跑马灯实验解析
  2. CISSP考点拾遗——关于道德
  3. educoder——面向对象程序设计java——第三阶段-Java 高级特性——Java 集合框架
  4. 逍遥刘强 - 期货大作手风云录(2015年8月28日)
  5. 人工智能发展历史与常见名词解释
  6. 电脑进入pe时蓝屏_进入PE系统也会蓝屏?运行PE系统蓝屏原因及解决方法
  7. 冰点还原精灵如何破载?
  8. 《东周列国志》第十七回 宋国纳赂诛长万 楚王杯酒虏息妫
  9. RoadRunner软件初步使用教程
  10. 电子商务中与客户沟通宝典