题意:
定义f函数:
给定长度为n的序列a,q次询问,每次询问给出L,R,问[L,R]的所有子区间中,f()值最大的是多少。
数据范围:n<=5e3,q<=1e5
解法:
从小区间往大区间推,
推出f(l,r)=f(l,r-1)^f(l+1,r)
可以发现是区间dp合并的式子,
那么f(l,r)就可以用区间dp计算出来,
计算出f[l][r]之后,在f[][]的基础上区间dp计算出ma[l][r]就行了
code:
#include<bits/stdc++.h>
using namespace std;
const int maxm=5e3+5;
int ma[maxm][maxm];
int d[maxm][maxm];
int sum[maxm];
int a[maxm];
int n,q;
signed main(){
ios::sync_with_stdio(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
//d[][]
for(int i=1;i<=n;i++){
d[i][i]=a[i];
}
for(int len=2;len<=n;len++){
for(int i=1;i<=n;i++){
int j=i+len-1;
if(j>n)break;
d[i][j]=(d[i][j-1]^d[i+1][j]);
}
}
//ma[][]
for(int i=1;i<=n;i++){
ma[i][i]=d[i][i];
}
for(int len=2;len<=n;len++){
for(int i=1;i<=n;i++){
int j=i+len-1;
if(j>n)break;
ma[i][j]=max(d[i][j],max(ma[i][j-1],ma[i+1][j]));
}
}
//
cin>>q;
while(q--){
int l,r;cin>>l>>r;
cout<<ma[l][r]<<endl;
}
return 0;
}