第k大异或值
这道题与2018年十二省联考中的异或粽子很相像,可以算作一个简易版;
因为这不需要可持久化;
也就是说求任意两个数异或起来的第k大值;
首先把所有数放进trie里。
然后二分答案,枚举每个数,相应地在trie上从高位开始跑,统计答案。
具体做法:当前跑到二进制第k位,已经确定了比k高的位的数字,使得每一位与当前枚举的数的异或等于mid的这一位。
如果mid第k位为0,那么这一位异或为1的一定对答案有贡献,把整个子树的答案加起来。然后继续做下一位。
时间复杂度O(nlog^2n)
#include <bits/stdc++.h>
using namespace std;
const int maxn=50005,maxm=200005,M=15;
typedef long long LL;
int n,a[maxn],l,r,mid;
LL m,ans,sum[maxm],t;
char c;
int read()
{
for (c=getchar();c<'0' || c>'9';c=getchar());
int x=c-48;
for (c=getchar();c>='0' && c<='9';c=getchar()) x=x*10+c-48;
return x;
}
void insert(int x,int num,int w)
{
sum[x]++;
if (w<0) return;
if ((num&(1<<w))==0) insert(x<<1,num,w-1);else insert(x<<1|1,num,w-1);
}
int query(int x,int num,int w,int now)
{
if (w<0) return sum[x];
int t=((num&(1<<w))>0);
if ((now&(1<<w))==0) return query(x<<1|t,num,w-1,now)+sum[x<<1|(t^1)];
return query(x<<1|(t^1),num,w-1,now);
}
bool check(int x)
{
if (!x) return 1;
ans=0;
for (int i=0;i<n;i++) ans+=query(1,a[i],M,x);
if (ans>=m) return 1;
return 0;
}
int main()
{
scanf("%d%lld",&n,&m);
for (int i=0;i<n;i++) insert(1,a[i]=read(),M);
for (l=0,r=(1<<(M+1))-1,mid=r>>1;l<r;mid=l+r>>1)
if (check(mid)) l=mid+1;else r=mid;
if (!check(l)) l--;
printf("%d\n",l);
fclose(stdin); fclose(stdout);
return 0;
}
第k大异或值的更多相关文章
- Loj 114 k大异或和
Loj 114 k大异或和 构造线性基时有所变化.试图构造一个线性基,使得从高到低位走,异或上一个非 \(0\) 的数,总能变大. 构造时让任意两个 \(bas\) 上有值的 \(i,j\) ,满足 ...
- 【线性基】51nod1312 最大异或和&LOJ114 k大异或和
1312 最大异或和 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 有一个正整数数组S,S中有N个元素,这些元素分别是S[0] ...
- LibreOJ #114. k 大异或和
二次联通门 : LibreOJ #114. k 大异或和 /* LibreOJ #114. k 大异或和 WA了很多遍 为什么呢... 一开始读入原数的时候写的是for(;N--;) 而重新构造线性基 ...
- [LOJ#114]k 大异或和
[LOJ#114]k 大异或和 试题描述 这是一道模板题. 给由 n 个数组成的一个可重集 S,每次给定一个数 k,求一个集合 T⊆S,使得集合 T 在 S 的所有非空子集的不同的异或和中,其异或和 ...
- LOJ.114.K大异或和(线性基)
题目链接 如何求线性基中第K小的异或和?好像不太好做. 如果我们在线性基内部Xor一下,使得从高到低位枚举时,选base[i]一定比不选base[i]大(存在base[i]). 这可以重构一下线性基, ...
- LOJ114 k大异或和
传送门 (vjudge和hdu也有但是我觉得LOJ好看!而且限制少!) 不过本题描述有误,应该是k小. 首先我们需要对线性基进行改造.需要把每一位改造成为,包含最高位的能异或出来的最小的数. 为啥呢? ...
- 线性基求第k小异或值
题目链接 题意:给由 n 个数组成的一个可重集 S,每次给定一个数 k,求一个集合 \(T \subseteq S\), 使得集合 T 在 S 的所有非空子集的不同的异或和中, 其异或和 \(T_1 ...
- 【loj114】k大异或和 线性基+特判
题目描述 给由 $n$ 个数组成的一个可重集 $S$ ,每次给定一个数 $k$ ,求一个集合 $T⊆S$ ,使得集合 $T$ 在 $S$ 的所有非空子集的不同的异或和中,其异或和 $T_1 ...
- hdu 3949 第k大异或组合
题意: 给你一些数,其中任选一些数(大于等于一个),那么他们有一个异或和. 求所有这样的异或和的第k小. 我们可以将每一位看成一维,然后就是给我们n个60维的向量,求它们线性组合后得到的向量空间中,第 ...
随机推荐
- delphi将字符串转换成stringlist
function StrToList(const sString, Token: string): TStringList;var sTmp: string; iPos: Integer; Tokle ...
- 如何使用PHP排序key为字母+数字的数组
你还在为如何使用PHP排序字母+数字的数组而烦恼吗? 今天有个小伙伴在群里问: 如何将一个key为字母+数字的数组按升序排序呢? 举个例子: $test = [ 'n1' => 22423, ' ...
- hadoop HA+Federation(高可用联邦)搭建配置(一)
hadoop HA+Federation(高可用联邦)搭建配置(一) 标签(空格分隔): 未分类 介绍 hadoop 集群一共有4种部署模式,详见<hadoop 生态圈介绍>. HA联邦模 ...
- AT3576 Popping Balls
AT3576 Popping Balls 好题!一种以前没怎么见过的思路! %%ywy 以什么方式,什么位置统计本质不同的方案,才能不重不漏是处理所有计数问题的主心骨. 本题难以容斥.难以DP. 所以 ...
- logserver 日志服务项目发布
logserver是使用logback.light-4j.commons-exec等构建的简单日志服务,参考项目logbackserver和light4j,支持跟踪日志.分页查看.搜索定位.下载文件等 ...
- 20191121-5 Scrum立会报告+燃尽图 01
此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/10065 一.小组情况 组长:贺敬文组员:彭思雨 王志文 位军营 徐丽君队名 ...
- QObject 的拷贝构造和赋值操作
QOject 中没有提供一个拷贝构造函数和赋值操作符给外界使用,其实拷贝构造和赋值的操作都是已经声明了的,但是它们被使用了Q_DISABLE_COPY () 宏放在了private区域.因此所有继承自 ...
- 异常值检验实战1--风控贷款年龄变量(附python代码)
python风控评分卡建模和风控常识(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005214003&am ...
- 代码bug管理工具bugfree与禅道
禅道官网有一键安装包,一键安装即可用 bugfree 搭建lnmp环境 详情参考zabbix 解压bugfree包 到nginx的html里 unzip bugfree3.0.4.zip mv b ...
- jmeter 执行python脚本的方法 。(亲测ok)
jmeter 执行python脚本 jmeter 可以通过Jython 执:行python代码 1.下载Jython jar包:http://www.jython.org/downloads.ht ...