zoukankan      html  css  js  c++  java
  • RMQ模板

     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 }
  • 相关阅读:
    新式类、经典类与多继承
    实现抽象类之方式二
    实现抽象类之方式一
    re模块
    28个高频Linux命令
    Git使用教程
    编程语言介绍
    编码
    进制
    操作系统简史
  • 原文地址:https://www.cnblogs.com/pblr/p/5733617.html
Copyright © 2011-2022 走看看