RMQ 算法

http://blog.csdn.net/niushuai666/article/details/6624672

通过学习这位神牛的文章初步认识 RMQ....

View Code
 1 #include <iostream>
 2 #include <cmath>
 3 #define maxn 10005
 4 using namespace std;
 5 int maxsum[maxn][20], minsum[maxn][20];
 6 
 7 void RMQ(int num)    //预处理->O(nlogn)  
 8 {
 9     int i, j;
10     for(j = 1; j < 20; ++j)
11       for(i = 1; i <= num; ++i)
12       if(i + (1 << j) -1 <= num)
13       {
14           maxsum[i][j] = max(maxsum[i][j-1], maxsum[i+(1 << j)][j-1]);
15           minsum[i][j] = min(minsum[i][j-1], minsum[i+(1 << j)][j-1]);
16         }
17 }
18 
19 int main()
20 {
21     int i, j, num, t, query;
22     cin >> t;
23     while(t--)
24     {
25         cin >> num >> query;
26         for(i = 0; i < num; i++)
27         {
28             cin >> maxsum[i][0];
29             minsum[i][0] = maxsum[i][0];
30         }
31         RMQ(num);
32         int start, end, maxl, minl;
33         while(query--) //o(1) 查询 
34         {
35             cin >> start >> end;
36             int k = (int)((log(end-start+1))/log(2.0));
37             maxl = max(maxsum[start][k], maxsum[end-(1 << k)+1][k]);
38             minl = min(minsum[start][k], minsum[end-(1 << k)+1][k]);
39             cout << maxl << minl << endl;
40         }
41     }
42     return 0;
43 }

讲解的ST() 算法.. 在敲代码的时候,想到这个算法预处理的时候消耗的时间会相对 线段树等的时间长点, 但是在查询的时候就变得O(1).

本来是想是不是线段树的他都能处理呢? 我想是不可以的, 正是因为他的处理的时间略长, 如果说是边处理和边询问的话是不是就会变得时间上受不了.

那么它就是只是用于处理完所有的数据之后再查询的情况下, 如果操作和询问交叉的时候时间上会不能忍受.

自己现在的想法,也许想错。 下次想到更多的再补充。

原文地址:https://www.cnblogs.com/yoru/p/2668354.html