线段树写法不管,比较灵活。这里主要讨论DP实现。

其实单纯说RMQ解决的是区间最值查询是不准确的,只要满足一个区间的信息可以从它的覆盖区间获得(即[L,R]<=[L,r],[l,R] (l<=r) ,允许两个子区间重合)即可使用。重合不影响最值判断,所以最值查询是可以用RMQ的,其次如同区间gcd,重合区间也是不影响求值的。一样可以用RMQ。

下面用RMQ的实现来解释上述结论:

dp[i][j]表示以i起始,长度为2^j的线段信息。它可以划分为dp[i][j-1],dp[i+2^(j-1)][j-1],所以状态转移就出来,dp[i][j]=某种计算(dp[i][j-1],dp[i+2^(j-1)][j-1];

查询的话,如果像线段树那样用递归分解区间求解,复杂度log级,因为是严格分离区间,所以不存在之前说的重合影响(所以线段树适用范围大啊)。而DP实现要求在O(1)时间给出答案,所以我们可以把查询区间分解为两个尽可能大的子区间(允许覆盖),这有个很简单的写法,对于区间L,R的查询,求一下k=log2(R-L+1),两个子区间为dp[L][k],dp[R-2^k+1][k];

以区间gcd为例:

LL lg2(LL p)//计算log2(n)
{
return (LL)(log(p) / log());
}
const LL len = ;//数据长度
const LL bitlen = ;//需要的位数
LL n;
LL dp[len][bitlen];//dp数组
LL bit[bitlen];//预处理2^n
void initRMQ()//初始化
{
for (LL j = ; bit[j] < n; j ++)
for (LL i = ; i+bit[j] <= n; i++)
dp[i][j] = gcd(dp[i][j - ], dp[i + bit[j - ]][j - ]);
}
LL query(LL l, LL r)
{
LL mig = lg2(r - l + 1.0);
return gcd(dp[l][mig], dp[r - bit[mig] + ][mig]);
}

对于需要增删改的操作,显然是线段树比较合适,对于有大量查询操作的题目,RMQ可以有效降低时间(最近遇到的这类题目对时间空间要求都很高,写代码写丑一点就挂了。提醒自己多注意)。

RMQ 解决区间查询问题的更多相关文章

  1. RMQ 问题 ST 算法(模板)

    解决区间查询最大值最小值的问题 用 $O(N * logN)$ 的复杂度预处理 查询的时候只要 $O(1)$ 的时间  这个算法是 real 小清新了   有一个长度为 N 的数组进行 M 次查询 可 ...

  2. RMQ(dp)

    我一开始是不知道有这么个东西,但是由于最近在学习后缀数组,碰到一道题需要用到后缀数组+RMQ解决的所以不得不学习了. 原理:用A[1...n]表示一组数,dp[i][j]表示从A[i]到A[i+2^j ...

  3. URAL 1297 Palindrome (后缀数组+RMQ)

    题意:给定一个字符串,求一个最长的回回文子串,多解输出第一个. 析:把字符串翻转然后放到后面去,中间用另一个字符隔开,然后枚举每一个回文串的的位置,对第 i 个位置,那么对应着第二个串的最长公共前缀, ...

  4. BZOJ 4491: 我也不知道题目名字是什么 RMQ

    4491: 我也不知道题目名字是什么 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 317  Solved: 174[Submit][Status][ ...

  5. 约束RMQ

    不知道为什么网上找不到太多相关的资料,所以写一个小总结,并附有能用的代码,抛砖引玉. 约束RMQ,就是RMQ区间必须满足两项之差最大为1,采用ST表的话,这时候有O(n)建表,O(1)查询的优秀复杂度 ...

  6. [noip模拟]数字对<RMQ&二分>

    数字对 [题目描述] 小H是个善于思考的学生,现在她又在思考一个有关序列的问题. 她的面前浮现出一个长度为n的序列{ai},她想找出一段区间[L, R](1 <= L <= R <= ...

  7. Codeforces Round #371 (Div. 1)

    A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...

  8. 找区间连续值(HDU5247)

    找连续数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. bzoj2119

    题意就是差分后求形如ABA的串的个数,B的长度为M 这是2011国家集训队互测的试题,是道好题,我直接给出出题人的题解吧: 对于这种在线性序列上的组合计数问题,我们很容易想到一个工具:分治!分治算法在 ...

随机推荐

  1. topcoder srm 305 div1

    problem1 link 直接按照题意模拟即可. import java.util.*; import java.math.*; import static java.lang.Math.*; pu ...

  2. css的再深入4(更新中···)

    两种居中的方式: Margin:0 auto;和text-align:center; Margin的居中是对自身,text-align对元素内部的文本来说. 隐藏的两种方式: visibility:h ...

  3. upc组队赛1 黑暗意志【stl-map】

    黑暗意志 题目描述 在数千年前潘达利亚从卡利姆多分离之时,迷雾笼罩着这块新形成的大陆,使它不被外来者发现.迷雾同样遮蔽着这片大陆古老邪恶的要塞--雷神的雷电王座.在雷神统治时期,他的要塞就是雷电之王力 ...

  4. BZOJ4018: 小Q的幻想之乡

    Description 背景 有一天,小Q梦见自己来到了理想国的幻想之乡. 描述 有一天,小Q梦见自己来到了理想国的幻想之乡.幻想乡有无穷户居民,第i个家庭住在编号为i的房屋里,编号从1开始,到正无穷 ...

  5. website for .Net Core

    5 Ways to Build Routing in ASP.NET Core Bundling in .NET Core MVC Applications with BundlerMinifier. ...

  6. python2.7 qt4

    https://jaist.dl.sourceforge.net/project/pyqt/PyQt4/PyQt-4.11.4/PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x64.e ...

  7. 【Selenium2】【问题】

    [iframe 和 HTML 相互嵌套] 比如126登录页,我的几个方法都不好用 1. iframeFather = driver.find_element(By.XPATH,"//div[ ...

  8. C# 使用 protobuf 进行对象序列化与反序列化

    protobuf 是 google的一个开源项目,可用于以下两种用途: (1)数据的存储(序列化和反序列化),类似于xml.json等: (2)制作网络通信协议. 源代码下载地址:https://gi ...

  9. AFM(3)---Maude使用说明

    load file-name 1可用绝对路径 2.可进入maude文件所在目录下load 3.默认工作空间是什么?

  10. variable_scope

    1. with tf.variable_scope("a"): b=tf.get_variable(name="g",initializer=12) print ...