XOR-pyramid
题解:
给n个数,询问q次,每次询问给出l,r. [l,r]区间求异或最大值为多少?
所以用dp[l][r]来表示区间l,r的答案
先对他进行预处理,预处理后就可以进行dp了。
递推公式:f[i][j]=max(f[i][j],max(f[i+1][j],f[i][j-1]));
/*Keep on going Never give up*/ #pragma GCC optimize(3,"Ofast","inline") #include <iostream> #include <cstdio> #include <stdlib.h> #include <cstring> #include <cmath> #include <math.h> #include <string> #include<string.h> #include <list> #include <set> #include <unordered_map> #include <queue> #include <stack> #include <algorithm> #include <stdlib.h> #include <vector> #include <cctype> #include<iomanip> #define int long long #define endl '\n' using namespace std; const int maxn = 5010; const int MaxN = 0x3f3f3f3f; const int MinN = 0xc0c0c00c; typedef long long ll; const ll mod= 998244353; using namespace std; int f[maxn][maxn],a[maxn]; signed main() { int n,m,l,r; scanf("%lld",&n,&m); for(int i=1;i<=n;i++)scanf("%lld",&a[i]); for(int i=n;i;i--) { for(int j=i;j<=n;j++) { if(i==j)f[i][j]=a[i]; else f[i][j]=f[i+1][j]^f[i][j-1]; } } for(int i=n;i;i--)for(int j=i;j<=n;j++)if(i!=j)f[i][j]=max(f[i][j],max(f[i+1][j],f[i][j-1])); scanf("%lld",&m); for(int i=1;i<=m;i++) { scanf("%lld%lld",&l,&r); printf("%lld\n",f[l][r]); } return 0; }