51nod 1174 1174 区间中最大的数

题目链接:51nod 1174 1174 区间中最大的数

ST(Sparse Table)算法学习参考博客:http://blog.csdn.net/niushuai666/article/details/6624672

O(nlogn)预处理,O(1)查询

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 using namespace std;
 5 const int N = 10001;
 6 int ma[N][20];
 7 int a[N];
 8 int n;
 9 void RMQ_init(){
10     int i, j;
11     for(i = 0; i < n; ++i) ma[i][0] = a[i];
12     int m = (int)(log(n*1.0) / log(2.0));
13     for(i = 1; i <= m; ++i){
14         for(j = 0; j < n; ++j){
15             ma[j][i] = ma[j][i-1];
16             if(j + (1 << (i-1)) <= n)
17                 ma[j][i] = max(ma[j][i], ma[j + (1 << (i-1))][i-1]);
18         }
19     }
20 }
21 int RMQ_max(int l, int r){
22     int m = (int)(log((r-l+1)*1.0) / log(2.0));
23     return max(ma[l][m], ma[r - (1 << m) + 1][m]);
24 }
25 int main(){
26     int q, i;
27     scanf("%d", &n);
28     for(i = 0; i < n; ++i) scanf("%d", &a[i]);
29     RMQ_init();
30     scanf("%d", &q);
31     int l, r;
32     while(q--){
33         scanf("%d%d", &l, &r);
34         printf("%d\n", RMQ_max(l, r));
35     }
36     return 0;
37 }
View Code

 

posted @ 2016-11-02 22:45  GraceSkyer  阅读(397)  评论(0编辑  收藏  举报

~~~~~~ACM大牛语录,激励一下~~~~~~

为了世界的和平,为了女生的安全,我拼命做题,做题,做题!

用最短的时间,刷最多的题!

给我一滴泪,我就看到了你全部的海洋!

seize the hour, seize the day.

人生难免有无奈,幸福走远了,或是感叹幸福来迟了.其实我一直相信,无论手中的幸福是多么微不足道的感觉,我会把握住那每一分,每一秒,当幸福依旧像那百鸟般飞逝,终究无法掌握时,我会感谢它,曾经降临过!

A自己的题,让别人郁闷去吧

WA肠中过,AC心中留 TLE耳边过,AC特别牛

天然的悲苦和伤逝,过去有过,以后还会有

^*^一步一步往上爬^*^

AC就像练级,比赛就像PK. 练级不如PK好玩

其实,世上本没有ACM,AC的人多了,也便有了!

AC无止尽~ Seek you forever~

找呀找呀找水题,找到一个AC一个呀!

AC是检验程序的唯一标准。

真的猛士,敢于直面惨淡的人生,敢于正视淋漓的鲜血……