[CodeForces]578B "Or" Game

因为x>=2,所以一个数每乘x,二进制位总会往前推至少一位。因此把所有的x贪心地乘在一个上面即可。
用前缀后缀和优化一下即可。
迷:为什么手写pow就过了,stl的pow就过不了??

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
long long n,k,x,a[200005],q[200005],h[200005],ans;
long long pow(long long d,long long z) {
    long long res=1;
    for(int i=1;i<=z;i++) res*=d;
    return res;
}
int main() {
    cin>>n>>k>>x;
    
    x=pow(x,k);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]),q[i]=q[i-1]|a[i];
    for(int i=n;i;i--) h[i]=h[i+1]|a[i];
    for(int i=1;i<=n;i++) {
        ans=max(ans,q[i-1]|(a[i]*x)|h[i+1]);
    }
    cout<<ans;
}

猜你喜欢

转载自www.cnblogs.com/sdfzhsz/p/9320447.html