题目描述

N个数字,要求选择M次,每次从N个数中选出两个数(Ai,Aj)(但不能和之前某次选择相同),此次选择的得分为Ai xor Aj。

求最大得分。

输入格式

第一行包含两个整数N,M

接下来一行共N个整数描述N个数字。

输出格式

输出一个整数,表示最大得分除以10^9+7的余数

解法

  设ans为两两异或得到的数中第m大的数。

  把N个数一起放到trie树里跑,对于ans的每一位,求出所有异或后这一位是1的数对的个数①加上已知异或结果大于ans的数对的个数②,如果>=2*m个(因为每两个数之间重复计算一次),那么这位肯定是1,否则一定是0。

(举个例子,ans=01xxxx,a^b=011xxx,则统计。a^b=010xxx,则不统计。a^b=101xxx不统计。)

(ans=0101xx  如果a^b=1xxxxx则统计。a^b=011xxx则统计。)

  为了方便说明,定义“异或数”为某两个数字异或的结果。  某数的第p位意思是这个数的二进制下从左往右数第p位。

  计算ans的第K位时,ans的前K-1位是已确定的。所以计算ans第K位的方法是:从N个数里枚举一个i,然后在trie树上从高位向低位跑。如果ans的第p位是0,sum(总数)+=与i异或后第p位是1的数的个数。往异或后等于ans的第p位方向走。最后sum+=异或后第K位是1的个数。特殊地,我们需要在trie树的每个节点上储存一个size,表示以该节点为根节点的子树中所有数的个数。这样,统计与i异或后第p位是1的个数时,只需要访问size就可以O(1)计算了。  如果sum>=2*m,那么这位肯定是1,否则一定是0。复杂度nlogn。

  求出m大值ans后,枚举每一个数,算出和它异或>=ans的数的和。还是从高位到低位处理:如果当前第K位是1,那么只能往异或后等于1的方向走,直接递归下去。否则,我们需要把异或之后这位是1的子树统计入答案,然后往异或后等于0的方向走。如何统计答案?在建立trie树的时候对每个节点还要维护一个信息,就是以这个点为根的子树所包含的数中,每一位有多少个数是1,有多少个数是0,这样就可以在logn的时间内算出某个数和这颗子树中所有数的异或和了。 然后再加上当前数和使得第i位异或为1的那个节点为根的子树的异或和就好了。

  总体复杂度nlog^2n,但是常数小。

#2560异或和问题 jdfz集训—秦岳的更多相关文章

  1. 紧跟腾讯大王卡:B站2233卡“基友号”即将上线

    来自B站官方的消息显示,B站在近期也将推出"基友号"功能,功能的内容是通话免费,考虑到这类互联网套餐都是中国联通在运营,因此在内容上可能也会效仿腾讯大王卡实现免费通话. 目前,B站 ...

  2. 牛客国庆集训派对Day4.B.异或求和(按位统计)

    题目链接 刷牛客一战到底做到的,感觉还挺有趣... \(Description\) 求给定\(n\)及序列\(A_i\),求\[\sum_{i\lt j\lt k}(A_i\oplus A_j)(A_ ...

  3. 2020牛客寒假算法基础集训营4 D:子段异或

    D : 子段异或 考察点 : 位运算,前缀和,异或的性质和应用 坑点 : 0 - L 的异或值是 0 的话也是一个区间 相同的值可能有多个,那么这时候区间就会有多个(x * (x + 1) / 2) ...

  4. 2020牛客寒假算法基础集训营4-D子段异或

    思路 CODE #include <bits/stdc++.h> #define dbg(x) cout << #x << "=" <&l ...

  5. Oracle 单实例 迁移到 RAC 实例 -- 使用RMAN 异机恢复

    Oracle 官网有关单实例迁移到RAC的一个步骤说明: How to Convert 10g Single-Instance database to 10g RAC using Manual Con ...

  6. [日常] NOIP前集训日记

    写点流水账放松身心... 10.8 前一天考完NHEEE的一调考试终于可以开始集训了Orz (然后上来考试就迟到5min, GG) T1维护队列瞎贪心, 过了大样例交上去一点也不稳...T出翔只拿了5 ...

  7. 2017-12 CDQZ集训(已完结)

    从联赛活了下来(虽然分数倒一……),接下来要去CDQZ集训啦…… DAY -2 2017-12-16 被老师安排负责一部分同学的住宿以及安排…… 抓紧时间继续学习,LCT真好玩啊真好玩…… 晚上放假了 ...

  8. 8.9 正睿暑期集训营 Day6

    目录 2018.8.9 正睿暑期集训营 Day6 A 萌新拆塔(状压DP) B 奇迹暖暖 C 风花雪月(DP) 考试代码 A B C 2018.8.9 正睿暑期集训营 Day6 时间:2.5h(实际) ...

  9. 8.4 正睿暑期集训营 Day1

    目录 2018.8.4 正睿暑期集训营 Day1 A 数对子 B 逆序对 C 盖房子 考试代码 A B C 2018.8.4 正睿暑期集训营 Day1 时间:4.5h(实际) 期望得分:30+50+3 ...

随机推荐

  1. BZOJ3331 BZOJ2013 压力

    考前挣扎 圆方树这么早就出现了嘛... 要求每个点必须被经过的次数 所以就是路径上的割点/端点++ 由于圆方树上所有非叶子圆点都是割点 所以就是树上差分就可以辣. 实现的时候出了一点小问题. 就是这里 ...

  2. python爬虫 1.自己定义类实现scrapy框架的基本功能

    1.定义调度器,引擎,下载器,爬虫器,管道器 # 调度器,下载器,爬虫器,引擎,管道类 class Scheduler(): """调度器类""&qu ...

  3. redisTemplate 封装bitcout

    @Repositorypublic class RedisServiceExtend { @Autowired private RedisTemplate<String, String> ...

  4. Python的"random"函数的使用(一)

    random.randrange(1,10) 随机产生0~7之间的整数,不包含7. random.sample(range(100), 5) 随机从range(100)中产生5个数,放入一个list. ...

  5. Spring框架之接口实现覆盖(接口功能扩展)

    在日常开发中,存在着这种一种场景,框架对接口A提供了一个种默认的实现AImpl,随着需求的变更,现今AImpl不能满足了功能需要,这时,我们该怎么办? 当然是修改AImpl的实现代码了,但是,如果它是 ...

  6. 圆周率Pi是如何计算出来的

    object SparkPi { def main(args: Array[String]) { val spark = SparkSession .builder .appName("Sp ...

  7. Thinkphp5 使用爬虫框架 QueryList3 的非composer方法教程

    首先,我要吐槽一下.我查了很多博客用tp框架使用composer方法结合 QueryList的教程.就是没有找到非composer的方法.于是摸索总结成功的经验: 工具:phpQuery.php 和 ...

  8. Shorten IPv6 Address

    题目链接 题意:转换一个128位的二进制串,变成16进制,并且格式为x:x:x:x:x:x:x:x然后多个相邻的0变成::,且只有一个::,求变成的字典序最小且最短的字符串. 思路:大水题,但是就是一 ...

  9. moment.js 时间库

    一.概念:    https://www.cnblogs.com/Jimc/p/10591580.html    或    http://momentjs.cn/(官网) 1.Moment.js是一个 ...

  10. [CSP-S模拟测试]:赤壁情(DP)

    前赤壁赋 壬戌之秋,七月既望,苏子与客泛舟游于赤壁之下.清风徐来,水波不兴.举酒属客,诵明月之诗,歌窈窕之章.少焉,月出于东山之上,徘徊于斗牛之间.白露横江,水光接天.纵一苇之所如,凌万顷之茫然.浩浩 ...