1 /*******************************************************
 2 RMQ模板
 3 RMQ解决区间最值问题
 4 用dp[i][j]记录从i个数开始长度为2^j个数的最值,所以有
 5 dp[i,j]=max(dp[i,j-1],dp[i+2^(j-1),j-1]),这我就能很快建立
 6 dp数组了。在查询的时候我把区间分成相等两份,这两份可能有
 7 相交的部分。然后从这两份中选择最值就可以了。
 8 ********************************************************/
 9 void makermq()
10 {
11     for (int i=1;i<=n;i++)
12     {
13         dpmax[i][0]=a[i];
14     }
15     for (int j=1;(1<<j)<=n;j++)
16     {
17         for (int i=1;i+(1<<j)-1<=n;i++)
18         {
19             dpmax[i][j]=max(dpmax[i][j-1],dpmax[i+(1<<(j-1))][j-1]);
20         }
21     }
22 
23 }
24 
25 int rmq(int u,int v)
26 {
27     int k=(int)(log(v-u+1)/log(2.0));
28     return max(dpmax[u][k],dpmax[v-(1<<k)+1][k]);
29 }

 

posted on 2016-08-03 17:04  pb2016  阅读(585)  评论(0编辑  收藏  举报