zoukankan      html  css  js  c++  java
  • 位运算(或前缀和)

    链接: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;
    }
    
    
    
     
  • 相关阅读:
    第三章:Hadoop简介及配置Hadoop-1.2.1,hbase-0.94.13集群
    maven环境的搭建,lemon-OA办公系统的搭建
    如何打开mo文件并修改 PoEdit
    安装Elastix-2.4版本
    RabbitMQ安装
    Yum编译安装Error Downloading Packages报错
    linux:ping不通www.baidu.com
    tar命令解压缩出错
    PV、UV
    使用存储过程创建数据
  • 原文地址:https://www.cnblogs.com/lipu123/p/14325175.html
Copyright © 2011-2022 走看看