位运算(或前缀和)

链接:https://ac.nowcoder.com/acm/contest/549/D
来源:牛客网

位运算是一个非常重要的东西。而小A最近在学习位运算,小A看到了一道很简单的例题,是说从N个数里面选出N-1个数要让它们或起来的值最大,小A想知道这个答案是多少。你可以帮帮他吗?

输入描述:

第一行一个整数N表示有N个数接下来一行N个数表示A1,A2...AN第一行一个整数N表示有N个数\\
接下来一行N个数表示A_{1},A_{2}...A_{N}NNNA1,A2...AN

输出描述:

一行输出个结果代表最大值一行输出个结果代表最大值
示例1

输入

复制
5
1 2 4 8 16

输出

复制
30

说明

选择2,4,8,16或的和是最大的,没有比这个更大的方案。
这里说的是n-1个数字,也就是有一个没有的,所以你要枚举那个没有的,那怎么样让前面的和后面的接上呢,
这样你弄一个sum1代表前面的前缀和,sum2代表后面的前缀和,
所以去掉i,之后的权值就是sum1[i-1]|sum2[i+1]
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+100; 
ll sum1[maxn];
ll sum2[maxn];
ll a[maxn]; 
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        sum1[i]=sum1[i-1]|a[i];//从前向后的前缀和 
    }
    for(int i=n;i>=1;i--){//从后向前的前缀和 
        sum2[i]=sum2[i+1]|a[i]; 
    }
    ll ans=0;
    for(int i=1;i<=n;i++){
        ans=max(ans,sum1[i-1]|sum2[i+1]);
    }
    cout<<ans<<endl;
}

 

 
posted @ 2021-01-25 14:47  lipu123  阅读(363)  评论(0编辑  收藏  举报