zoukankan      html  css  js  c++  java
  • CF-579 D. "Or" Game

    题意:

    给一列数,任选一个数,乘x,最多操作k次,问最后a[1]|a[2]|...|a[n]的最大值是多少;

    思路:

    或运算是0|0=0,1|0=1,0|1=1,1|1=1,那么每次乘一个大于等于2的数就能使最高位数增加,那么肯定是把k个x都乘在一个数上才能最大,把a[1]|...|a[n]的前后缀都找出来,暴力枚举要找的那个数,得到最大值就好了。

     蛮好的一个方法,保存前缀和后缀的和

     比赛的时候由于思维定式把or看成xor了,甚至连给的公式都没有扳回我僵化的思维

    #include<iostream>
    #include<cstdio>
    #define maxn 200010
    using namespace std;
    int a[maxn],n,k,x;
    long long nxt[maxn],pre[maxn],base=1,ans,sum;
    long long solve(int id){
        long long res=0;
        res=pre[id-1]|nxt[id+1]|(1LL*a[id]*base);
        return res;
    }
    int main(){
        scanf("%d%d%d",&n,&k,&x);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            sum|=a[i];
            pre[i]=pre[i-1]|a[i];
        }ans=sum;
        for(int i=n;i>=1;i--){
            nxt[i]=nxt[i+1]|a[i];
        }
        while(k--)
            base=1LL*base*x;
        for(int i=1;i<=n;i++){
            long long now=solve(i);
            if(now>ans)ans=now;
        }
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    P2679 子串
    线段树优化建边
    P2444 [POI2000]病毒
    P3966 [TJOI2013]单词
    4327: JSOI2012 玄武密码
    UVA1449 Dominating Patterns
    P1250 种树
    P2255 [USACO14JAN]记录奥林比克
    SP283 NAPTIME
    P3436 [POI2006]PRO-Professor Szu
  • 原文地址:https://www.cnblogs.com/thmyl/p/11755182.html
Copyright © 2011-2022 走看看