#2560异或和问题 jdfz集训—秦岳
题目描述
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集训—秦岳的更多相关文章
- 紧跟腾讯大王卡:B站2233卡“基友号”即将上线
来自B站官方的消息显示,B站在近期也将推出"基友号"功能,功能的内容是通话免费,考虑到这类互联网套餐都是中国联通在运营,因此在内容上可能也会效仿腾讯大王卡实现免费通话. 目前,B站 ...
- 牛客国庆集训派对Day4.B.异或求和(按位统计)
题目链接 刷牛客一战到底做到的,感觉还挺有趣... \(Description\) 求给定\(n\)及序列\(A_i\),求\[\sum_{i\lt j\lt k}(A_i\oplus A_j)(A_ ...
- 2020牛客寒假算法基础集训营4 D:子段异或
D : 子段异或 考察点 : 位运算,前缀和,异或的性质和应用 坑点 : 0 - L 的异或值是 0 的话也是一个区间 相同的值可能有多个,那么这时候区间就会有多个(x * (x + 1) / 2) ...
- 2020牛客寒假算法基础集训营4-D子段异或
思路 CODE #include <bits/stdc++.h> #define dbg(x) cout << #x << "=" <&l ...
- Oracle 单实例 迁移到 RAC 实例 -- 使用RMAN 异机恢复
Oracle 官网有关单实例迁移到RAC的一个步骤说明: How to Convert 10g Single-Instance database to 10g RAC using Manual Con ...
- [日常] NOIP前集训日记
写点流水账放松身心... 10.8 前一天考完NHEEE的一调考试终于可以开始集训了Orz (然后上来考试就迟到5min, GG) T1维护队列瞎贪心, 过了大样例交上去一点也不稳...T出翔只拿了5 ...
- 2017-12 CDQZ集训(已完结)
从联赛活了下来(虽然分数倒一……),接下来要去CDQZ集训啦…… DAY -2 2017-12-16 被老师安排负责一部分同学的住宿以及安排…… 抓紧时间继续学习,LCT真好玩啊真好玩…… 晚上放假了 ...
- 8.9 正睿暑期集训营 Day6
目录 2018.8.9 正睿暑期集训营 Day6 A 萌新拆塔(状压DP) B 奇迹暖暖 C 风花雪月(DP) 考试代码 A B C 2018.8.9 正睿暑期集训营 Day6 时间:2.5h(实际) ...
- 8.4 正睿暑期集训营 Day1
目录 2018.8.4 正睿暑期集训营 Day1 A 数对子 B 逆序对 C 盖房子 考试代码 A B C 2018.8.4 正睿暑期集训营 Day1 时间:4.5h(实际) 期望得分:30+50+3 ...
随机推荐
- Web核心之Request对象
HTTP协议中Request请求部分格式 //请求行(这种是POST类型的请求) POST /HttpServleLogin.html HTTP/1.1 //请求头(User-Agent里有Firef ...
- boost Shared Memory
Shared Memory Shared memory is typically the fastest form of interprocess communicatioin. It provide ...
- Java反射学习-1 - 反射获取类的属性,方法,构造器
新建一个Person类 package cn.tx.reflect; /** * 注解初步了解 * @author Administrator * */ public class Person { p ...
- shell脚本学习(3)sed替换
1 sed 替换 1格式: 's/原字符串/新字符串/' 输入源 2正确参考: sed ’s/as/AS/' do.txt 改变字符串as为AS,不会改输入源的文件. 匹配每行第一次匹配的 ...
- click和blur冲突的问题
昨天在前端群里讨论到一个问题,大家平时做表单验证的时候一般都有个input框和删除按钮,然后习惯性在失去焦点的时候去验证输入的内容是否正确,做验证,发请求等等.这个时候,那个点击删除按钮往往也就触发了 ...
- AcWing 314. 低买 (线性DP)打卡
题目:https://www.acwing.com/problem/content/316/ 题意:求一个最长单调递减子序列,然后并且求方案数,如果序列完全一样就不要了 思路:我们肯定时修改LIS,我 ...
- Codeforces Round #578 (Div. 2) E. Compress Words (双哈希)
题目:https://codeforc.es/contest/1200/problem/E 题意:给你n个单词,你需要把他合成成一个句子,相邻的两个单词,相邻部分相同的话可以把其中一个的删掉 思路:因 ...
- oauth2学习
oauth2 生词: 授权码模式(authorization code) 简化模式(implicit) 密码模式(resource owner password credentials) 客户端模式( ...
- 在Windows及Linux下获取毫秒级运行时间的方法
在Windows下获取毫秒级运行时间的方法 头文件:<Windows.h> 函数原型: /*获取时钟频率,保存在结构LARGE_INTEGER中***/ WINBASEAPI BOOL W ...
- pip安装第三方库报错Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None))...
pip安装第三方库时报错Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None))...,详细报错见下 ...