Enlace de tema
http://codeforces.com/problemset/problem/578/B
Título
Matriz 2e5, puede hacer * x operaciones en cualquier elemento, hasta k veces, encontrar el valor máximo del OR bit a bit de cada elemento después del procesamiento
Ideas
Primero, se puede probar que k tiempos deben realizarse en el mismo número.
Debido a que x es mayor que 2, la cadena binaria debe aumentarse al menos un bit después de la operación. Si no está toda asignada a una, debe reasignarse a una situación en la que el bit más alto sea mayor y la respuesta sea mayor.
No puede simplemente realizar k operaciones en el número más grande. Por ejemplo, 100 110, x = 2, k = 1, la respuesta a 100 es 1110 y la respuesta a 110 es 1100.
Considerando la violencia, usamos prefijos y optimizaciones especiales. Pr mantiene la suma de prefijos de or bit a bit, y ta mantiene la suma de sufijos de or bit a bit, de modo que podemos manejar k operaciones por elemento en O (1) y atravesar cada elemento. , Solo registre la respuesta, la complejidad del tiempo es O (n)
Código
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<string>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
#define int long long
//#define double long double
using namespace std;
typedef long long ll;
const int maxn=200500;
const int inf=0x3f3f3f3f;
int n,k,x;
int a[maxn];
int pr[maxn],ta[maxn];
signed main(){
IOS
cin>>n>>k>>x;
for(int i=1;i<=n;i++)
cin>>a[i];
a[0]=a[n+1]=0;
for(int i=1;i<=n;i++){
pr[i]=a[i]|pr[i-1];
}
for(int i=n;i>=1;i--){
ta[i]=a[i]|ta[i+1];
}
int p=1;
while(k--){
p*=x;
}
int ans=-inf;
for(int i=1;i<=n;i++){
int t=pr[i-1]|(a[i]*p)|ta[i+1];
ans=max(ans,t);
}
cout<<ans<<endl;
}