題意:
給一列數,任選一個數,乘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; }