CF578B Or Game

贪心+思路

我们很快就能发现,将k个机会分散出去不如集中在最大的数上优,因为x>=2所以每乘一次,当前数的二进制位最高位都至少左移1位,所以我们枚举将这k次机会用在哪个数身上可以取到最大,那么我们可以维护一个前缀或,一个后缀或,枚举到这个数时直接查表取出,然后取max就好了

代码

//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lli long long int
using namespace std;
const int M=200500;
lli n,m,e;
lli a[M],pre[M],suf[M];
int main()
{
	scanf("%I64d%I64d%I64d",&n,&m,&e);
    lli ans=1,tmp,sum=0LL;
    for (int i=1;i<=m;i++) ans=ans*e;
    for (int i=1;i<=n;i++) scanf("%I64d",&a[i]);
    for (int i=1;i<n;i++)
    pre[i+1]=pre[i]|a[i];
    for (int i=n;i>1;i--)
    suf[i-1]=suf[i]|a[i];
    for (int i=1;i<=n;i++)
    sum=max(pre[i]|(a[i]*ans)|suf[i],sum);
	printf("%I64d",sum);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/acerandaker/article/details/81070249