#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 ...
随机推荐
- Morphia开发简介
1. 什么是Morphia Morphia是一个开放源代码的对象关系映射框架,它对MongoDB数据库 java版驱动进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵 ...
- js append()和appendChild()和insertBefore()的区别
<body> <input type="button" value="删除" id="btn"> <scrip ...
- list去重方法
list去重 方法1:利用循环去重 s= [1,1,2,2,2,3,4,4] res= [] for i in s: if i not in res: res.append(i) print(res) ...
- 回炉Spring--Bean生命周期及AOP
Spring容器: 在基于Spring的应用中,你的应用对象生存于Spring容器(container)中,Spring容器负责创建对象,装配它们,配置它们并管理它们的整个生命周期,从生存到死亡.(在 ...
- Python爬虫之抓图
从"百度图片(http://image.baidu.com/)"的首页下载图片 # -*- coding: utf-8 -*- import urllib import re im ...
- loadRunner函数之web_add_header
web_add_header 功能:用于添加指定的报文头到下一次HTTP请求 格式:web_add_header( const char *Header, const char *Content ), ...
- SQL SERVER内部函数大全
SQL SERVER内部函数是SQL数据库中非常重要的一类函数,下面就为您介绍SQL SERVER内部函数,如果您对此方面感兴趣的话,不妨一看. SQL SERVER内部函数: select @@CO ...
- VC++ 创建及调用Dll
一._stdcall 被这个关键字修饰的函数,其参数都是从右向左通过堆栈传递的(__fastcall 的前面部分由ecx,edx传), 函数调用在返回前要由被调用者清理堆栈. 这个关键字主要见于Mic ...
- python打印9宫格,25宫格等奇数格,且横竖斜相加和相等
代码如下: #!/usr/bin/env python3#-*- coding:utf-8 -*-num = int(input('请输入一个奇数:'))# 定义一个长为num的列表high = [[ ...
- python改变导入模块中的变量的问题
Python中循环函数1调用函数2,函数2中import了一个模块,函数1: def run(): for a in b: runTest(a,patter) 函数2: def runTest(cas ...