博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
# NOI.AC省选赛 第五场T1 子集,与&最大值
阅读量:5220 次
发布时间:2019-06-14

本文共 925 字,大约阅读时间需要 3 分钟。

NOI.AC省选赛 第五场T1

A. Mas的童年

题目链接

思路

0x00

\(n^2\)的暴力挺简单的。

ans=max(ans,xor[j-1]+xor[j-1]^xor[i]);

01trie树求最大异或和相信大家都会。不会看.

这与我们今天这个题目有关吗?
毫无关系。
xor[i]的某一位为1,xor[j]的那一位不管是啥,贡献都是为1。
而xor[i]的某一位为0,xor[j]的贡献是2或0。(xor[j]位上为1贡献为2)
(这里的1,2都是2^(k)的1倍,两倍)
所以我们只要考虑xor[i]的位上为0的贡献。
将xor[i]取反,就是求与(&)最大值。
最后整理一下就可以计算出答案了。

0x01

如何求与(&)最大值

把每个插入的值的所有子集装进一个桶里。
然后从大到小选择判断是否在桶里面出现过,因为从大到小枚举,所以一定不会冲突掉,就好了,这看代码比较清晰。
相似的,我们也可以求或(|)的最大值

0x02

复杂度?

x如果枚举过了就不用再枚举
那复杂度就是每个数枚举下二进制
\((nlogn)\)
当然如果插入数的上限太大了话应该就做不了。

代码

#include 
using namespace std;const int N=2e6+7;int read() { int x=0,f=1;char s=getchar(); for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1; for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0'; return x*f;}int n,a[N],xo[N],tong[N];void mark(int x) {//枚举子集 tong[x]=1; for(int i=0;i<20;i++) if((x>>i&1)&&(!tong[x^(1<
=0;--i) if(!((1<

转载于:https://www.cnblogs.com/dsrdsr/p/10628676.html

你可能感兴趣的文章
2017西安区域赛A / UVALive - 8512 线段树维护线性基合并
查看>>
喵哈哈村的灯刀姐妹
查看>>
润乾的下拉列表和下拉数据集的使用
查看>>
UML期末复习题——2.9:UML Deployment Diagram
查看>>
在微信公众号开发(微站)过程中用Zepto/jquery的on/live绑定的click事件点击无效(不能执行)...
查看>>
django后台处理前端上传和显示图片
查看>>
3. express 框架使用 vue框架 weiUI
查看>>
实例化积累
查看>>
求解单源最短路问题:Bellman-Ford算法(可判负权回路)详解 之 poj 3268 Silver Cow Party...
查看>>
节点属性(DOM对象)
查看>>
重回游戏开发-第7周
查看>>
【转载】VC维,结构风险最小化
查看>>
【转】linux HZ Tick Jiffies
查看>>
【探路者】团队第一周贡献分数分配结果
查看>>
计算方法 读书笔记
查看>>
css3之 media query 使用(转)
查看>>
【单源最短路模板】 poj 2387
查看>>
思想总结
查看>>
BZOJ 1012 洛谷1198 最大数 maxnumber
查看>>
如何提升程序员的工作效率?
查看>>