题意:定义长度为m的序列b,其值为f(b)=f( b[1}^b[2],b[2]^b[3],..,b[m-1]^b[m]) m>1
Q次询问,每次询问[L,R]内价值最大的子区间. n<=5e3, 0<=a[i]<2^30 Q<=1e5.
若b的长度为m,设:p[i]为b[i]的系数,p[i]=C(m-1,i-1)%2.
则序列b的价值最后为:f(1,m)=p[1]*b[1] ^ p[2]*b[2]....^ p[m]*b[m]
第i项的系数=C(m-1,i-1)%2 = c(m-2,i-2)^c(m-2,i-1)
Q次询问,每次询问[L,R]内价值最大的子区间. n<=5e3, 0<=a[i]<2^30 Q<=1e5.
若b的长度为m,设:p[i]为b[i]的系数,p[i]=C(m-1,i-1)%2.
则序列b的价值最后为:f(1,m)=p[1]*b[1] ^ p[2]*b[2]....^ p[m]*b[m]
第i项的系数=C(m-1,i-1)%2 = c(m-2,i-2)^c(m-2,i-1)
得到f(L,R) = f(L,R-1) ^f(L+1,R)
#include <bits/stdc++.h>
using namespace std;
const int N=5e3+5;
int n,Q,a[N],f[N][N],d[N][N];
int solve(int l,int r)
{
if(r-l+1==1)
return f[l][r]=a[l];
if(f[l][r]!=-1)
return f[l][r];
return f[l][r]=solve(l,r-1)^solve(l+1,r);
}
void init()
{
for(int j=1;j<=n;j++)
for(int i=j;i>=1;i--)
d[i][j]=max(d[i+1][j],solve(i,j));//suf's j to i
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
f[i][j]=max(f[i][j-1],d[i][j]);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
memset(f,-1,sizeof(f));
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
init();
cin>>Q;
while(Q--)
{
int l,r;
cin>>l>>r;
cout<<f[l][r]<<'\n';
}
return 0;
}