第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维的向量,求它们线性组合后得到的向量空间中,第 ...
随机推荐
- 2019.9.5 Balanced Lineup
题目传送门 板子*3 #include<iostream> #include<cstdio> #include<cstring> #include<cmath ...
- linux虚拟机安装centos6.x
安装系统,作为每一个it技术控们的基本功,对于各位大神和技术大牛们应该是易如反掌或者是家常便饭啦,都是从无数次安装,重装,刷机中一步步走来的.那么今天,我也分享一套装机教程,共各位和我一样的小白参考或 ...
- ARTS打卡计划第十六周
Algorithms: https://leetcode-cn.com/problems/min-stack/submissions// Review: https://www.infoq.cn/ar ...
- Dubbo系列(二)dubbo的环境搭建
dubbo是一个分布式服务框架,提供一个SOA的解决方案.简单的说,dubbo就像在生产者和消费者中间架起了一座桥梁,使之能透明交互.本文旨在搭建一个可供使用和测试的dubbo环境,使用了spring ...
- Linux命令(用户管理、组和时间管理)
用户管理 Linux系统是一个多用用户的系统 用户分为三类: 超级用户(root)用户的id是0 伪用户 用户的id是1----499,虽然存在,但不能被登录 ...
- Cache As Ram
1. Why need Cache? Cache又称之为高速缓存,是为了弥补CPU和主存之间逐渐增大的速度上的差距 而被迫在两者之间加入的一个小的SRAM.现代处理器上通常都会有三级或者是四级缓存,这 ...
- ArcGIS Python查看geodatabase(.gdb)版本
代码:10.0不能运行 import arcpy desc = arcpy.Describe(r'C:\Users\dell\Documents\ArcGIS\default.gdb') print ...
- ansible-playbook的YAML语法学习
YAML:可以将你打算对多机器的批量操作放到一个文件中,顺序执行,可以根据机器做到根据机器信息判断执行,其他命令执行结果判断执行. YAML有着严格的层级要求,稍微有个缩进问题就会无法运行,所以学习过 ...
- leetcode 日常清单
a:excellent几乎一次ac或只有点小bug很快解决:半年后再重刷: b:经过艰难的debug和磕磕绊绊或者看了小提示才刷出来: c:经过艰难的debug没做出来,看答案刷的: 艾宾浩斯遗忘曲线 ...
- Oracle 中的进制转换
Oracle 中的进制转换 */--> Oracle 中的进制转换 Table of Contents 1. 进制名 2. 10进制与16进制互相转换 2.1. 10进制转换为16进制 2.2. ...