二次联通门 : LibreOJ #114. k 大异或和

  1. /*
  2. LibreOJ #114. k 大异或和
  3.  
  4. WA了很多遍
  5. 为什么呢。。。
  6.  
  7. 一开始读入原数的时候写的是for(;N--;)
  8. 而重新构造线性基的时候要用到N。。。所以GG
  9.  
  10. 对于找第k大异或和
  11. 只需把原来的线性基重新构造
  12. 构造规则为
  13. 若i<j, aj的第j位是1,就把aj异或上ai
  14.  
  15. 查询的时候将k二进制拆分,对于1的位,就异或上对应的线性基。
  16. 最终得出的答案就是k小值。
  17. */
  18. #include <cstring>
  19. #include <cstdio>
  20.  
  21. inline void read (long long &now)
  22. {
  23. register char word = getchar ();
  24. bool temp = false;
  25. for (now = ; word < '' || word > ''; word = getchar ())
  26. if (word == '-')
  27. temp = true;
  28. for (; word >= '' && word <= ''; now = now * + word - '', word = getchar ());
  29. if (temp)
  30. now = -now;
  31. }
  32.  
  33. long long N, M;
  34.  
  35. class Linear_Base_Type
  36. {
  37. static const int _L = ;
  38.  
  39. private :
  40.  
  41. long long number[_L + ];
  42. long long data[_L + ];
  43.  
  44. int Count;
  45.  
  46. public :
  47.  
  48. Linear_Base_Type ()
  49. {
  50. memset (data, , sizeof data);
  51. memset (number, , sizeof number);
  52. Count = ;
  53. }
  54.  
  55. inline void Insert (register long long key)
  56. {
  57. for (register int i = _L; i >= ; i --)
  58. if (key & (1LL << i))
  59. {
  60. if (number[i] == )
  61. {
  62. number[i] = key;
  63. break;
  64. }
  65. key ^= number[i];
  66. }
  67. return ;
  68. }
  69.  
  70. void Re_Build ()
  71. {
  72. for (register int i = , j; i <= _L; i ++)
  73. for (j = ; j < i; j ++)
  74. if ((1LL << j) & number[i])
  75. number[i] ^= number[j];
  76.  
  77. for (register int i = ; i <= _L; i ++)
  78. if (number[i])
  79. data[Count ++] = number[i];
  80. }
  81.  
  82. inline long long Query_kth (register long long k)
  83. {
  84. long long res = ;
  85.  
  86. if (Count != N)
  87. -- k;
  88. if (k >= (1LL << Count))
  89. return -;
  90.  
  91. for (register int i = ; i <= _L; i ++)
  92. if (k & (1LL << i))
  93. res ^= data[i];
  94.  
  95. return res;
  96. }
  97. };
  98.  
  99. Linear_Base_Type Make;
  100.  
  101. int main (int argc, char *argv[])
  102. {
  103. long long x;
  104. read (N);
  105.  
  106. for (int i = ; i <= N; i ++)
  107. {
  108. read (x);
  109.  
  110. Make.Insert (x);
  111. }
  112. read (M);
  113. for (Make.Re_Build (); M --; )
  114. {
  115. read (x);
  116.  
  117. printf ("%lld\n", Make.Query_kth (x));
  118. }
  119. return ;
  120. }

LibreOJ #114. k 大异或和的更多相关文章

  1. Loj 114 k大异或和

    Loj 114 k大异或和 构造线性基时有所变化.试图构造一个线性基,使得从高到低位走,异或上一个非 \(0\) 的数,总能变大. 构造时让任意两个 \(bas\) 上有值的 \(i,j\) ,满足 ...

  2. [LOJ#114]k 大异或和

    [LOJ#114]k 大异或和 试题描述 这是一道模板题. 给由 n 个数组成的一个可重集 S,每次给定一个数 k,求一个集合 T⊆S,使得集合 T 在 S 的所有非空子集的不同的异或和中,其异或和  ...

  3. LOJ.114.K大异或和(线性基)

    题目链接 如何求线性基中第K小的异或和?好像不太好做. 如果我们在线性基内部Xor一下,使得从高到低位枚举时,选base[i]一定比不选base[i]大(存在base[i]). 这可以重构一下线性基, ...

  4. 【线性基】51nod1312 最大异或和&LOJ114 k大异或和

    1312 最大异或和 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题   有一个正整数数组S,S中有N个元素,这些元素分别是S[0] ...

  5. 第k大异或值

    这道题与2018年十二省联考中的异或粽子很相像,可以算作一个简易版: 因为这不需要可持久化: 也就是说求任意两个数异或起来的第k大值: 首先把所有数放进trie里. 然后二分答案,枚举每个数,相应地在 ...

  6. LOJ114 k大异或和

    传送门 (vjudge和hdu也有但是我觉得LOJ好看!而且限制少!) 不过本题描述有误,应该是k小. 首先我们需要对线性基进行改造.需要把每一位改造成为,包含最高位的能异或出来的最小的数. 为啥呢? ...

  7. 【loj114】k大异或和 线性基+特判

    题目描述 给由 $n​$ 个数组成的一个可重集 $S​$ ,每次给定一个数 $k​$ ,求一个集合 $T⊆S​$ ,使得集合 $T​$ 在 $S​$ 的所有非空子集的不同的异或和中,其异或和 $T_1 ...

  8. hdu 3949 第k大异或组合

    题意: 给你一些数,其中任选一些数(大于等于一个),那么他们有一个异或和. 求所有这样的异或和的第k小. 我们可以将每一位看成一维,然后就是给我们n个60维的向量,求它们线性组合后得到的向量空间中,第 ...

  9. 1738. 找出第 K 大的异或坐标值

    2021-05-19 LeetCode每日一题 链接:https://leetcode-cn.com/problems/find-kth-largest-xor-coordinate-value/ 标 ...

随机推荐

  1. qt-博客

    将QQ中的图文聊天内容显示到Qt界面: http://www.qter.org/portal.php?mod=view&aid=12

  2. c# asp.net 实现分页(pager)功能

    分页PagerHelper辅助类 using System;using System.Web; public class PagerHelper { #region 获取分页的Html代码 /// & ...

  3. 回归损失函数:L1,L2,Huber,Log-Cosh,Quantile Loss

    回归损失函数:L1,L2,Huber,Log-Cosh,Quantile Loss 2019-06-04 20:09:34 clover_my 阅读数 430更多 分类专栏: 阅读笔记   版权声明: ...

  4. vue-cli3 使用雪碧图

    //vue.config.js const path = require("path"); const SpritesmithPlugin = require("webp ...

  5. ajax:用于创建快速动态网页的技术

    ajax是一种用于创建快速动态网页的技术. 异步的javascript和XML(JSON),主要是完成一个局部刷新. 异步:你传输吧,我先干我自个儿的事,你传好了告诉我一声 同步:你传输,我停下活儿看 ...

  6. moment.js(日期处理类库)的使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. gitlab中的几个常用界面(runner管理、gitlab-ci.yml管理、runner token管理、新建用户、拉用户入工程、拉用户入组、复制工程导入组)

    目录: 1.runner管理 2.gitlab-ci.yml管理 3.runner token管理 4.新建用户 5.拉用户入工程 6.拉用户入组 7.复制工程导入组 1.runners界面 http ...

  8. CentOS linux7 设置开机启动服务

    常用命令 描述                                 旧命令  新命令 使服务自动启动          chkconfig --level 3 http on  syste ...

  9. C C++输出格式 <转载>仅用于个人

    转载链接:C++ C C语言输出格式总结 1 一般格式    printf(格式控制,输出表列)    例如:printf("i=%d,ch=%c\n",i,ch);    说明: ...

  10. ndk学习之C语言基础复习----虚拟内存布局与malloc申请

    在这一次中来学习一下C语言的内存布局,了解它之后就可以解释为啥在用malloc()申请的内存之后需要用memset()来对内存进行一下初始化了,首先来了解一下物理内存与虚拟内存: 物理内存:通过物理内 ...