http://codeforces.com/contest/620/problem/F
这题给的时限是10S,且数据量不大,可以O(n*(n+m))大概2e9 过。。。
**O(n3)优化到O(n2)用到了dp预处理
1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 #include<map> 5 #include<queue> 6 #include<set> 7 #include<vector> 8 #define MAXN 1000005 9 using namespace std; 10 typedef long long ll; 11 int a[100005]; 12 struct Edg{ 13 int l,r; 14 int num,v; 15 }e[10005]; 16 int b[100005],xor1[1000005]; 17 int main() 18 { int n,m; 19 20 scanf("%d%d",&n,&m); 21 for(int i=1;i<=n;i++) 22 { 23 scanf("%d",&a[i]); 24 } 25 xor1[0]=0; 26 for(int i=1;i<=1000000;i++) 27 { 28 xor1[i]=xor1[i-1]^i; 29 } 30 31 for(int i=1;i<=m;i++) 32 { 33 scanf("%d%d",&e[i].l,&e[i].r); 34 e[i].num=i,e[i].v=0; 35 } 36 37 int res; 38 for(int i=1;i<=n;i++) 39 { 40 for(int j=i;j<=n;j++) 41 { 42 res=xor1[a[i]]^xor1[a[j]]^min(a[i],a[j]); 43 if(j==i) b[j]=res; 44 else b[j]=max(res,b[j-1]); 45 } 46 for(int k=1;k<=m;k++) 47 { if(e[k].l<=i&&i<=e[k].r) 48 { 49 e[k].v=max(e[k].v,b[e[k].r]); 50 } 51 52 } 53 } 54 for(int k=1;k<=m;k++) 55 { 56 printf("%d ",e[k].v); 57 } 58 return 0; 59 }