NOI.AC省选赛 第五场T1

A. Mas的童年

题目链接

http://noi.ac/problem/309

思路

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 <bits/stdc++.h>
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<<i)]))
mark(x^(1<<i));
}
int askand(int x) {//RT
int ans=0;
for(int i=19;i>=0;--i)
if(!((1<<i)&x) && tong[ans|(1<<i)]) ans|=(1<<i);
return ans;
}
int main() {
n=read();
for(int i=1;i<=n;++i) a[i]=read(),xo[i]=xo[i-1]^a[i];
for(int i=1;i<=n;++i) {
cout<<askand(xo[i])*2+xo[i]<<" ";
mark(xo[i]);
}
return 0;
}

# NOI.AC省选赛 第五场T1 子集,与&最大值的更多相关文章

  1. noi.ac NOIP2018 全国热身赛 第二场 T1 ball

    [题解] 可以发现每次推的操作就是把序列中每个数变为下一个数,再打一个减一标记:而每次加球的操作就是把球的位置加上标记,再插入到合适的位置. 用set维护即可. #include<cstdio& ...

  2. NOI.AC NOIP模拟赛 第二场 补记

    NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...

  3. NOI.AC NOIP模拟赛 第一场 补记

    NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...

  4. NOI十连测 第五测 T1

    #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #inclu ...

  5. 牛客网提高组模拟赛第五场 T1同余方程(异或)(位运算)

    区间不好做,但是我们可以转化成前缀来做.转化为前缀之后之后就是二维前缀和. 但是我还是不怎么会做.所以只能去看吉老师的题解 (确定写的那么简单真的是题解???). 我们要求模一个数余0,就等于找它的倍 ...

  6. noi.ac NOIP2018 全国热身赛 第二场 T3 color

    [题解] 我们可以发现每次修改之后叶子结点到根的路径最多分为两段:一段白色或者黑色,上面接另一段灰色的.二分+倍增找到分界点,然后更新答案即可. check的时候只需要判断当前节点对应的叶子结点的区间 ...

  7. NOI.AC NOIP模拟赛 第五场 游记

    NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...

  8. noi.ac 第五场第六场

    t1应该比较水所以我都没看 感觉从思路上来说都不难(比牛客网这可简单多了吧) 第五场 t2: 比较套路的dp f[i]表示考虑前i个数,第i个满足f[i]=i的最大个数 i能从j转移需要满足 j< ...

  9. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

随机推荐

  1. Nginx打卡

    Nginx打卡 此括号中的是干货 [ 直接说最关心的事:如何去掉访问路径的端口号? 答案:使用Nginx啊 具体安装还需看底下啰嗦的东东,安装OK且完美启动的同学,server proxy_pass ...

  2. Python学习之旅(三十五)

    Python基础知识(34):电子邮件(Ⅰ) 几乎所有的编程语言都支持发送和接收电子邮件 在使用Python收发邮件前,请先准备好至少两个电子邮件,如xxx@163.com,xxx@sina.com, ...

  3. socket 编程中。 服务端用到多线程

    客户端连接服务端之后, 服务端会生成与客户端交换信息的socket. 在服务端实现多线程: 为每个连接创建一个线程进行信息交换. import threading from socket import ...

  4. emoji表情softbank和unicode不兼容解决方案

    https://blog.ernest.me/post/emoji-remapping-solution

  5. xpinyin模块

    import xpinyin s = xpinyin.Pinyin() #一个实例化,以后了解 print(s.get_pinyin('小小军')) #get_pinyin方法,转出来的拼音,每一个汉 ...

  6. linux下yum安装及配置

    1 2 3 4 分步阅读 公司使用的是linux搭建服务器,linux安装软件能够使用yum安装依赖包是一件非常简单而幸福的事情,所以这里简单介绍一下linux安装yum源流程和操作. 工具/原料 电 ...

  7. 经典的PHPer为什么被认为是草根?

    PHPer是草根吗? 从PHP诞生之日起,PHP就开始在Web应用方面为广大的程序员服务.同时,作为针对Web开发量身定制的脚本语言,PHP一直秉承简单.开源的思想,这也使得PHP得以快速的发展,并且 ...

  8. ZooKeeper之service discovery

    Zookeeper整体介绍 ZooKeeper is a centralized service for maintaining configuration information, naming, ...

  9. [LeetCode] 90.Subsets II tag: backtracking

    Given a collection of integers that might contain duplicates, nums, return all possible subsets (the ...

  10. enzyme design 整体流程及感想

    想起什么来写什么吧. 整体流程(以Ceas2, TPP, G3P为例): 准备蛋白即配体参数文件: 设置CST文件: 准备protocol和flag文件: 运行enzyme_design: 结果处理. ...