题目描述

You are given an array a of n integers.

You need to find the maximum value of ai|(aj&ak) over all triplets (i,j,k) such that i<j<k.

大意

给你一个包含n个整数的序列a

你要在所有满足i<j<k的三元组中找到最大的ai|aj&ak

3<=n<=106

0<=a[i]<=2*106

题解

一,位运算

|指的是二进制后的按位或

如  2|5=7,7|9=15

&指的是二进制后的按位且

如  3&2=2,13&10=8

二、题目

说完了简单的位运算,我们正式进入主题

“按位或”有个特点,就是如果一个数当前位置上是1,则结果当前位置上也一定是1

看上去好废话啊

这样的话,我们就可以枚举更方便确定的a[i]

我们不妨定义a[j]&a[k]的值叫q

那么q一定是a[j]和a[k]的子集(数字的子集是转化为二进制后,每一位都小于等于原数字的数,而不是集合)

因此,我们就可以遍历这些数字的子集,要用dfs执行

当然,别忘了高位优先 !

三、dfs深搜

这部分的深搜很像状压DP,我们只需要找出现了两次的子集即可,同时我们还要避免同一个数的子集算了两次

如110的子集010和100的下一个子集都是000

用vis数组记录即可

四、代码

#include<iostream>
using namespace std;
int sum[2000010],a[1000010],vis[2000010],n,ans;
void h(int x,int y){
if(sum[x]>1||vis[x]==y) return ;
++sum[x];
vis[x]=y;
for(int i=0;(1<<i-1)<x;i++)
if(x&(1<<i)) h(x^(1<<i),y);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
h(a[n],n);
h(a[n-1],n-1);
for(int i=n-2;i>=1;i--){
int k=0;
for(int j=20;j>=0;j--){
if(!(a[i]&(1<<j))&&sum[k^(1<<j)]>1) k^=(1<<j);
}
ans=max(ans,a[i]|k);
h(a[i],i);
}
printf("%d",ans);
return 0;
}

Codeforces 1208F Bits And Pieces的更多相关文章

  1. Codeforces 1208F Bits And Pieces 位运算 + 贪心 + dp

    题意:给你一个序列a, 问a[i] ^ (a[j] & a[k])的最大值,其中i < j < k. 思路:我们考虑对于每个a[i]求出它的最优解.因为是异或运算,所以我们从高位向 ...

  2. Codeforces 1208F - Bits And Pieces(高维前缀和)

    题面传送门 题意:求 \(\max\limits_{i<j<k}a_i|(a_j\&a_k)\). \(1\leq n \leq 10^6,1\leq a_i\leq 2\time ...

  3. Codeforces F. Bits And Pieces(位运算)

    传送门. 位运算的比较基本的题. 考虑枚举\(i\),然后二进制位从大到小考虑, 对于第\(w\)位,如果\(a[i][w]=1\),那么对\(j.k\)并没有什么限制. 如果\(a[i][w]=0\ ...

  4. CF1208F Bits And Pieces

    CF1208F Bits And Pieces 传送门 思路 这里要运用SOS-DP的思路(\(\text{Sum over Subsets}\)).我在另外一篇博客里介绍过,如有需要可以搜索一下我的 ...

  5. Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2) F. Bits And Pieces sosdp

    F. Bits And Pieces 题面 You are given an array

  6. CodeForces 485C Bits[贪心 二进制]

    C. Bits time limit per test1 second memory limit per test256 megabytes inputstandard input outputsta ...

  7. Codeforces 132E Bits of merry old England 【最小费用最大流】

    题意: 让你输出长度为n的某个序列,然后给你m个变量. 每次给某个数赋值的代价是 假设赋值a=7那么代价是3,因为7的二进制位中有3个1. 要求最后总代价最小. 输出总共要进行操作的次数,和最小代价. ...

  8. Codeforces 328B-Sheldon and Ice Pieces(馋)

    B. Sheldon and Ice Pieces time limit per test 1 second memory limit per test 256 megabytes input sta ...

  9. CodeForces 484A Bits(水题)

    A. Bits time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  10. codeforces C. Bits(数学题+或运算)

    题意:给定一个区间,求区间中的一个数,这个数表示成二进制的时候,数字1的个数最多! 如果有多个这样的数字,输出最小的那个! 思路:对左区间的这个数lx的二进制 从右往左将0变成1,直到lx的值大于右区 ...

随机推荐

  1. VUE子组件使用父组件值并赋值

    子组件使用父组件值,要改变使用用赋值方法,定义新变量: 定义新变量:copyTrendObj 此时copyTrendObj 可以被赋值 props: { trendObj: { type: Objec ...

  2. Postgresql 全局索引与分区索引对于SQL性能影响的比较及DDL操作后分区全局索引是否会失效

    Postgresql 提供了对于分区表 global index 的支持.global index 不仅提供了对于唯一索引功能的改进(无需包含分区键),而且在性能上相比非global index (l ...

  3. 开发者进阶必备的9个Tips & Tricks!

    优秀的开发人员市场前景是十分广阔的,但想找到一份理想的工作,仅有代码知识是不够的.优秀的工程师应该是一个终身学习者.问题的创造性解决者,着迷于整个软件世界.要成为一名优秀的开发者,应该具备哪些品质并做 ...

  4. ImportError: cannot import name 'six' from 'django.utils'的解决办法

    解决办法 对于3.x版本的django,安装django-utils-six2.0 pip install django-utils-six

  5. 尺取法 C - Vasya and String CodeForces - 676C

    C - Vasya and String CodeForces - 676C #include<iostream> using namespace std; int main() { lo ...

  6. java字段值为null,不返回该字段

    jackSon注解– @JsonInclude 注解不返回null值字段 @Data @JsonInclude(JsonInclude.Include.NON_NULL) public class R ...

  7. web上传插件Uploadify

    Uploadify简单说来,是基于Jquery的一款文件上传插件.它的功能特色总结如下: 支持单文件或多文件上传,可控制并发上传的文件数 在服务器端支持各种语言与之配合使用,诸如PHP,.NET,Ja ...

  8. replace 常用积累

    1.替换有,或者.为: obj.keyword.replace(/,|./g,';') 2.替换元素标签类似于<em>文字</em>这种 let name=item.name. ...

  9. oracle 行转列,动态年份,月份列。已解决!

    -----------------存储过程包体----------- procedure GetComparativeAnalysisTB(p_StartTime varchar2, ----开始时间 ...

  10. H5移动端跳转唤起QQ在线客服与跳转支付宝

    以下两段代码都是找了很久的,在某个删库跑路的支付商那里找到的! H5移动端跳转QQ 实现在线客服 <a href="mqqwpa://im/chat?chat_type=wpa& ...