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 }