可惜没如果=_=
时光的河入海流

题目链接在这里:Problem - I - Codeforces

这道题首先应该知道一些异或的性质

 

然后以及动手画一下可以发现b[i][j]=b[i+1][j]^b[i][j-1]

由于这是求区间的最大值,所以我们可以用区间dp解决,因为只是最大值,不涉及到区间中分两半时的操作,所以可以降一维k的复杂度。

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 const int MAX=5005;
 4 int n,m,a[MAX],b[MAX][MAX],f[MAX][MAX];
 5 int main(){
 6     freopen ("i.in","r",stdin);
 7     freopen ("i.out","w",stdout);
 8     int len,i,j,l,r;
 9     scanf("%d",&n);
10     for (i=1;i<=n;i++){
11         scanf("%d",a+i);
12         f[i][i]=b[i][i]=a[i];
13     }
14     for (len=2;len<=n;len++)
15         for (i=1;i<=n-len+1;i++){
16             j=i+len-1;
17             b[i][j]=b[i+1][j]^b[i][j-1];
18             f[i][j]=max(b[i][j],max(f[i+1][j],f[i][j-1]));
19         }
20     scanf("%d",&m);
21     while (m--){
22         scanf("%d%d",&l,&r);
23         printf("%d\n",f[l][r]);
24     }
25     return 0;
26 }

 

posted on 2021-07-28 00:41  珍珠鸟  阅读(28)  评论(0编辑  收藏  举报