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]的先後綴都找出來,暴力枚舉要找的那個數,獲得最大值就行了。ios

 蠻好的一個方法,保存前綴和後綴的和spa

 比賽的時候因爲思惟定式把or當作xor了,甚至連給的公式都沒有扳回我僵化的思惟code

#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;
}
相關文章
相關標籤/搜索