【暑假】[实用数据结构]范围最小值问题(RMQ)
2024-10-12 06:13:30
范围最小值问题:
提供操作:
- Query(L,R):计算min{AL ~ AR }
Sparse-Table算法:
定义d[i][j]为从i开始长度为2j的一段元素的最小值。所以可以用递推的方法表示。
预处理RMQ_init如下(感觉像区间DP):
int RMQ_init(const vector<int>& A){
int n=A.size();
for(int i=;i<n;i++) d[i][] = A[i];
for(int j=;(<<j)<=n;j++)
for(int i=;i+(<<j)-<n;i++)
d[i][j]=min(d[i][j-],d[i+(<<(j-))][j-]);
}
询问回值RMQ如下:
int RMQ(int L,int R){
int k=;
while((<<(k+))<=R-L+) k++;
return min(d[L][k],d[R-(<<k)+][k]);
//左右结点均覆盖确保不遗漏
}
作者所给模板:
struct RMQ {
int d[maxn][maxlog];
void init(const vector<int>& A) {
int n = A.size();
for(int i = ; i < n; i++) d[i][] = A[i];
for(int j = ; (<<j) <= n; j++)
for(int i = ; i + (<<j) - < n; i++)
d[i][j] = max(d[i][j-], d[i + (<<(j-))][j-]);
} int query(int L, int R) {
int k = ;
while((<<(k+)) <= R-L+) k++; // 如果2^(k+1)<=R-L+1,那么k还可以加1
return max(d[L][k], d[R-(<<k)+][k]);
}
};
练习题目:UVa 11235
链接:
最新文章
- C#设计模式-备忘录模式
- SIHA环境修改主机名实施步骤
- wampserver下修改mysql root用户的登录密码
- 使用jquery再次封装ajax
- RabbitMQ 3.6 安装
- node.js 异步式I/O 与事件驱动
- AMQP与QPID简介
- kafka集群扩容以及数据迁移
- POJ 2182 Lost Cows (线段树)
- 谈谈字符集编码及gb2312、utf-8编码原理
- 2018-2019-2 网络对抗技术 20165304 Exp3 免杀原理与实践
- odoo8资料
- Android开发中Activity状态的保存与恢复
- cProfile——Python性能分析工具
- jq塞入不同状态html的写法 switch (defaults.type)
- 【Spark】SparkStreaming-foreachrdd foreachpartition
- Centos6.9安装JDK1.8
- Complex Instance Placement
- CentOS7安装OpenStack(Rocky版)-08.启动一个虚拟机实例
- 第八章 Mysql运算符
热门文章
- HTML5入门5---HTML5控件元素
- 开发版本控制git
- 234. Palindrome Linked List
- Android Navigation Drawer,自定义ActionBar(标题居中)
- NET Remoting 示例
- 重写hashCode()的方法
- Lua for windows中SciTe开启支持python的方法
- BZOJ 2299 向量
- ios 开发中 developer tools access 总是要输入密码问题的解决
- poj 3468 A Simple Problem with Integers (线段树 成段更新 加值 求和)