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/ 标 ...
随机推荐
- qt-博客
将QQ中的图文聊天内容显示到Qt界面: http://www.qter.org/portal.php?mod=view&aid=12
- c# asp.net 实现分页(pager)功能
分页PagerHelper辅助类 using System;using System.Web; public class PagerHelper { #region 获取分页的Html代码 /// & ...
- 回归损失函数:L1,L2,Huber,Log-Cosh,Quantile Loss
回归损失函数:L1,L2,Huber,Log-Cosh,Quantile Loss 2019-06-04 20:09:34 clover_my 阅读数 430更多 分类专栏: 阅读笔记 版权声明: ...
- vue-cli3 使用雪碧图
//vue.config.js const path = require("path"); const SpritesmithPlugin = require("webp ...
- ajax:用于创建快速动态网页的技术
ajax是一种用于创建快速动态网页的技术. 异步的javascript和XML(JSON),主要是完成一个局部刷新. 异步:你传输吧,我先干我自个儿的事,你传好了告诉我一声 同步:你传输,我停下活儿看 ...
- moment.js(日期处理类库)的使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- gitlab中的几个常用界面(runner管理、gitlab-ci.yml管理、runner token管理、新建用户、拉用户入工程、拉用户入组、复制工程导入组)
目录: 1.runner管理 2.gitlab-ci.yml管理 3.runner token管理 4.新建用户 5.拉用户入工程 6.拉用户入组 7.复制工程导入组 1.runners界面 http ...
- CentOS linux7 设置开机启动服务
常用命令 描述 旧命令 新命令 使服务自动启动 chkconfig --level 3 http on syste ...
- C C++输出格式 <转载>仅用于个人
转载链接:C++ C C语言输出格式总结 1 一般格式 printf(格式控制,输出表列) 例如:printf("i=%d,ch=%c\n",i,ch); 说明: ...
- ndk学习之C语言基础复习----虚拟内存布局与malloc申请
在这一次中来学习一下C语言的内存布局,了解它之后就可以解释为啥在用malloc()申请的内存之后需要用memset()来对内存进行一下初始化了,首先来了解一下物理内存与虚拟内存: 物理内存:通过物理内 ...