LibreOJ #114. k 大异或和
二次联通门 : LibreOJ #114. k 大异或和
/*
LibreOJ #114. k 大异或和 WA了很多遍
为什么呢。。。 一开始读入原数的时候写的是for(;N--;)
而重新构造线性基的时候要用到N。。。所以GG 对于找第k大异或和
只需把原来的线性基重新构造
构造规则为
若i<j, aj的第j位是1,就把aj异或上ai 查询的时候将k二进制拆分,对于1的位,就异或上对应的线性基。
最终得出的答案就是k小值。
*/
#include <cstring>
#include <cstdio> inline void read (long long &now)
{
register char word = getchar ();
bool temp = false;
for (now = ; word < '' || word > ''; word = getchar ())
if (word == '-')
temp = true;
for (; word >= '' && word <= ''; now = now * + word - '', word = getchar ());
if (temp)
now = -now;
} long long N, M; class Linear_Base_Type
{
static const int _L = ; private : long long number[_L + ];
long long data[_L + ]; int Count; public : Linear_Base_Type ()
{
memset (data, , sizeof data);
memset (number, , sizeof number);
Count = ;
} inline void Insert (register long long key)
{
for (register int i = _L; i >= ; i --)
if (key & (1LL << i))
{
if (number[i] == )
{
number[i] = key;
break;
}
key ^= number[i];
}
return ;
} void Re_Build ()
{
for (register int i = , j; i <= _L; i ++)
for (j = ; j < i; j ++)
if ((1LL << j) & number[i])
number[i] ^= number[j]; for (register int i = ; i <= _L; i ++)
if (number[i])
data[Count ++] = number[i];
} inline long long Query_kth (register long long k)
{
long long res = ; if (Count != N)
-- k;
if (k >= (1LL << Count))
return -; for (register int i = ; i <= _L; i ++)
if (k & (1LL << i))
res ^= data[i]; return res;
}
}; Linear_Base_Type Make; int main (int argc, char *argv[])
{
long long x;
read (N); for (int i = ; i <= N; i ++)
{
read (x); Make.Insert (x);
}
read (M);
for (Make.Re_Build (); M --; )
{
read (x); printf ("%lld\n", Make.Query_kth (x));
}
return ;
}
LibreOJ #114. k 大异或和的更多相关文章
- Loj 114 k大异或和
Loj 114 k大异或和 构造线性基时有所变化.试图构造一个线性基,使得从高到低位走,异或上一个非 \(0\) 的数,总能变大. 构造时让任意两个 \(bas\) 上有值的 \(i,j\) ,满足 ...
- [LOJ#114]k 大异或和
[LOJ#114]k 大异或和 试题描述 这是一道模板题. 给由 n 个数组成的一个可重集 S,每次给定一个数 k,求一个集合 T⊆S,使得集合 T 在 S 的所有非空子集的不同的异或和中,其异或和 ...
- LOJ.114.K大异或和(线性基)
题目链接 如何求线性基中第K小的异或和?好像不太好做. 如果我们在线性基内部Xor一下,使得从高到低位枚举时,选base[i]一定比不选base[i]大(存在base[i]). 这可以重构一下线性基, ...
- 【线性基】51nod1312 最大异或和&LOJ114 k大异或和
1312 最大异或和 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 有一个正整数数组S,S中有N个元素,这些元素分别是S[0] ...
- 第k大异或值
这道题与2018年十二省联考中的异或粽子很相像,可以算作一个简易版: 因为这不需要可持久化: 也就是说求任意两个数异或起来的第k大值: 首先把所有数放进trie里. 然后二分答案,枚举每个数,相应地在 ...
- LOJ114 k大异或和
传送门 (vjudge和hdu也有但是我觉得LOJ好看!而且限制少!) 不过本题描述有误,应该是k小. 首先我们需要对线性基进行改造.需要把每一位改造成为,包含最高位的能异或出来的最小的数. 为啥呢? ...
- 【loj114】k大异或和 线性基+特判
题目描述 给由 $n$ 个数组成的一个可重集 $S$ ,每次给定一个数 $k$ ,求一个集合 $T⊆S$ ,使得集合 $T$ 在 $S$ 的所有非空子集的不同的异或和中,其异或和 $T_1 ...
- hdu 3949 第k大异或组合
题意: 给你一些数,其中任选一些数(大于等于一个),那么他们有一个异或和. 求所有这样的异或和的第k小. 我们可以将每一位看成一维,然后就是给我们n个60维的向量,求它们线性组合后得到的向量空间中,第 ...
- 1738. 找出第 K 大的异或坐标值
2021-05-19 LeetCode每日一题 链接:https://leetcode-cn.com/problems/find-kth-largest-xor-coordinate-value/ 标 ...
随机推荐
- asp.net core-9.依赖注入的使用
http://www.jessetalk.cn/2017/11/06/di-in-aspnetcore/
- js文件分段上传
前端代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/T ...
- Asp.net core 学习笔记 2.2 migration to 3.0
Ef core 3.0 一些要注意的改变 refer : https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaki ...
- react中jsx文件是如何转换成js对象的
通过在线babel转换器,转换出jsx是如何变成js对象的 jsx文件 加入了正常的标签以及嵌套标签以及方法属性 function hello() { click=()=>{ console.l ...
- 怎样获取当前对象的原型对象prototype
1. 使用 Object.getPrototypeOf(); function Person(name){ this.name = name; } var lilei = new Person(&qu ...
- WIN10升级失败,故障代码 0X8007042B-0X4000D 解决
个人博客链接:WIN10升级失败,故障代码 0X8007042B-0X4000D 解决
- python处理RSTP视频流
python链接海康摄像头,并以弹出框的方式播放实时视频流, 这种方式是以弹出框的形式播放.本地测试可以,实际业务场景不建议使用.可以采用rtsp转rtmp的方式 @shared_task def p ...
- 【shell脚本】$ 在shell脚本中的使用
shell脚本中 '$' 与不同的符号搭配其表示的意义也会不同 特殊标志符 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数. 例如,第一个参数是$1,第二个 ...
- [书籍翻译] 《JavaScript并发编程》第四章 使用Generators实现惰性计算
本文是我翻译<JavaScript Concurrency>书籍的第四章 使用Generators实现惰性计算,该书主要以Promises.Generator.Web workers等技术 ...
- (详细)JAVA使用JDBC连接MySQL数据库(1)- 软件
欢迎任何形式的转载,但请务必注明出处. 本节为下面四个的安装和配置 jdk Eclipse MySQL mysql connectors 一.jdk 点击查看安装和环境配置教程 二.Eclipse 点 ...