RMQ(1)暴力O(n*n)

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\n",e[k].v);
57     }
58     return 0;
59 } 

 

posted @ 2018-03-19 21:57  hzhuan  阅读(134)  评论(0编辑  收藏  举报