感謝杜哥代碼滋磁

//以下是廢話

RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。

主要方法及复杂度如下:
1、朴素(即搜索),O(n)-O(qn) online。
2、线段树,O(n)-O(qlogn) online。
3、ST(实质是动态规划),O(nlogn)-O(q) online。
ST算法(Sparse Table),以求最大值为例,设d[i,j]表示[i,i+2^j-1]这个区间内的最大值,那么在询问到[a,b]区间的最大值时答案就是max(d[a,k], d[b-2^k+1,k]),其中k是满足2^k<=b-a+1(即长度)的最大的k,即k=[ln(b-a+1)/ln(2)]。
d的求法可以用动态规划,d[i, j]=max(d[i, j-1],d[i+2^(j-1), j-1])。
4、RMQ标准算法:先规约成LCA(Lowest Common Ancestor),再规约成约束RMQ,O(n)-O(q) online。
首先根据原数列,建立笛卡尔树,从而将问题在线性时间内规约为LCA问题。LCA问题可以在线性时间内规约为约束RMQ,也就是数列中任意两个相邻的数的差都是+1或-1的RMQ问题。约束RMQ有O(n)-O(1)的在线解法,故整个算法的时间复杂度为O(n)-O(1)。        ——來自百度百科
 
————————————————————————————————————廢話分割線———————————————————————————————————————————————————————
 
一·搜索
我懶得寫代碼,應該不太難就對了qwq
 
二·線段樹
我之前寫炸了的代碼忘記保存了,那麼就在這裡貼上杜哥的代碼好了emmm
這個維護的是區間最小值(廢話)還是很好懂的qwq

#include<iostream>
#include<cstdio>
#define maxn 1000010
#define INF 11000000
using namespace std; int n, m; int a[maxn]; #define lc i << 1
#define rc i << 1 | 1
int T[maxn * 4];
inline void maintain(int i){T[i] = min(T[lc], T[rc]);} void build(int i, int l, int r){
if(l == r){T[i] = a[l]; return ;}
int m = l + r >> 1;
build(lc, l, m); build(rc, m + 1, r);
maintain(i);
} void update(int i, int l, int r, int k, int v){
if(l == r){T[i] = v; return ;}
int m = l + r >> 1;
if(k <= m) update(lc, l, m, k, v);
else update(rc, m + 1, r, k, v);
maintain(i);
} int query(int i, int l, int r, int L, int R){
if(l > R || r < L) return INF;
if(L <= l && r <= R) return T[i];
int m = l + r >> 1;
return min(query(lc, l, m, L, R), query(rc, m + 1, r, L, R));
} inline void solve_1(){
int x, y; scanf("%d%d", &x, &y);
update(1, 1, n, x, y);
} inline void solve_2(){
int x, y; scanf("%d%d", &x, &y);
printf("%d\n", query(1, 1, n, x, y));
} int main(){
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
build(1, 1, n);
scanf("%d", &m);
for(int i = 1; i <= m; ++i){
int opt; scanf("%d", &opt);
switch(opt){
case 1 : solve_1(); break;
case 0 : solve_2(); break;
}
}
return 0;
}

  

三·ST表
看了百度百科才知道這竟然是動態規劃?!告辭.jpg
ST表有兩維,st[i][j]表示[j,j+2^i-1]的範圍內的最大(小)值。
如何維護?
首先我們可以確定,st[0][j]就是這個數本身,所以我們可以在此基礎上進行DP。二分的話顯然會快我們就二分好了qwq 
於是很顯然,[j,j+2^i-1]可以分成區間[j,j+2^(i-1)-1]和[j+2^(i-1),j+2^i],我們也就輕鬆地得到了狀態轉移方程:st[i][j]=max(st[i-1][j],st[i-1][j+(1<<(i-1))])
 
一個小優化:提前預處理好[1,n]中每個數的log值 (為什麼最大要到20呢?可能因為2^20足夠大吧qwq)
#include<cstdio>
#include<iostream>
using namespace std;
int Log[100005],st[23][100005],n,l,r,m; inline int max(int a,int b){
return a>b? a:b;
} inline long long read(){
long long a=0; int f=0; char p=getchar();
while(!isdigit(p)) {f|=p=='-'; p=getchar();}
while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48); p=getchar();}
return f? -a:a;
} int main()
{
n=read(),m=read();
for(int i=2;i<=n;++i) Log[i]=Log[(i>>1)]+1;
for(int i=1;i<=n;++i)
st[0][i]=read();
for(int i=1;i<=20;++i)
for(int j=1;j+(1<<i)-1<=n;++j)
st[i][j]=max(st[i-1][j],st[i-1][j+(1<<(i-1))]);
while(m--){
l=read(),r=read();
int t=Log[r-l+1];
printf("%d\n",max(st[t][l],st[t][r-(1<<t)+1]));
}
return 0;
}

  

 
四·標準算法
啥?這還有標準算法?笛卡爾樹?不認識不認識告辭了
 

(沒有介紹標準算法的)RMQ問題的更多相关文章

  1. Linux Kernel 排程機制介紹

    http://loda.hala01.com/2011/12/linux-kernel-%E6%8E%92%E7%A8%8B%E6%A9%9F%E5%88%B6%E4%BB%8B%E7%B4%B9/ ...

  2. COB(Chip On Board)的製程簡單介紹

    前面提及 COB 的生產與 IC 的封裝製程幾乎是一致的,除了把 leadframe 改成了 PCB,把封膠由 molding 改成 dispensing,少了 triming & marki ...

  3. Sublime Text 套件介紹:Pretty JSON

    JSON,一個輕量級的資料交換語言,目前許多網站AJAX request的回應結果都是JSON格式   以下是一個標準的JSON格式   1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...

  4. Sublime Text 套件介紹(四):Pretty JSON

    JSON,一個輕量級的資料交換語言,目前許多網站AJAX request的回應結果都是JSON格式   以下是一個標準的JSON格式   { "firstName": " ...

  5. PCB成型製程介紹

    PCB成型製程在電子構裝中所扮演的角色 下圖是電腦主機的內部組成 我們將以插在主機板上的一片 USB擴充卡來說明PCB成型製 程在電子構裝中所扮演的角色 PCB成型製程的子製程 USB擴充卡要插入主機 ...

  6. QR Code於台灣各行業的行銷應用案例介紹

    當走在東京的大街小巷時,在五花八門的廣告看板.雜誌.護照簽證.海關.宣傳品.廣告.旅遊和導覽手冊.產品包裝.甚至在餐廳菜單上,皆可看到上面有一組黑色神秘二維條碼圖案:QR Code,當看到有興趣的商品 ...

  7. Visual Studio 跨平台開發實戰(2) - Xamarin.iOS 基本控制項介紹 (转帖)

    前言 在上一篇文章中, 我們介紹了Xamarin 以及簡單的HelloWorld範例, 這次我們針對iOS的專案目錄架構以及基本控制項進行說明. 包含UIButton,, UISlider, UISw ...

  8. oracle系統表、數據字典介紹與日常問題診斷

    oracle系統表.數據字典介紹與日常問題診斷 數據字典是由唯讀的table和view組成的,產生於$oracle_home\rdbms\admin\catalog.sql.裡面儲存Oracle資料庫 ...

  9. 用Razor語法寫範本-RazorEngine組件介紹【转——非常好,可以用它来代替NVelocity】

    RazorEngine 官網網址:http://razorengine.codeplex.com 在找到RazorEngine之前曾經想過其他的方案,如T4與V8 Engine載jquery.temp ...

随机推荐

  1. 单目、双目和RGB-D视觉SLAM初始化比较

    无论单目.双目还是RGB-D,首先是将从摄像头或者数据集中读入的图像封装成Frame类型对象: 首先都需要将彩色图像处理成灰度图像,继而将图片封装成帧. (1) 单目 mCurrentFrame = ...

  2. nodeJs 安装 npm nodeModules package.json

    Nodejs   1.安装nodejs 从nodejs官网下载最新版本的node,设置环境变量这样就可以在cmd下直接用命令行操作npm 环境变量:path  d:/nodejs 查看本机node及n ...

  3. 白话控制反转IoC及其应用

    控制反转(IoC, Inversion of Control),依赖注入(DI, Dependency Injection)是在面向对象编程中经常碰到的专业术语.很多朋友可能在百度之后,便浅尝辄止,没 ...

  4. Awesome Django

     Awesome Django    If you find Awesome Django useful, please consider donating to help maintain it. ...

  5. LOB类型的学习、总结

    LOB相关的概念 LOB类型: 将信息文件(十进制.二进制).图像甚至音频信息采用数据库作为保存载体时,就需要使用lob类型数据. 有两种Lob,Internal Lob和External Lob.I ...

  6. 模拟实现MyBatis中通过SQL反射实体类对象功能

    话不多说,直接上干货! package cn.test; import java.lang.reflect.Method; import java.sql.Connection; import jav ...

  7. 微信小程序—day05

    小程序云服务器--环境配置 本来想要买腾讯云的云服务器,作为小程序的服务端的.无奈,腾讯云卖的太贵了,比阿里云要贵一倍,想想还是算了. 但是,没有服务端的接受,小程序的一些功能是实现不了的.找了一圈, ...

  8. linux部署MantisBT(三)部署MantisBT

    三.部署MantisBT 1.下载MantisBT https://www.mantisbt.org/download.php 2.将MantisBT安装包放在/apache/htdocs下并重命名为 ...

  9. Unity编辑器 - 编辑器控制特效播放

    编辑器控制特效播放 Unity的动画编辑器不能预览粒子系统的播放,为了方便预览特效,设想制作一个预览特效的工具,通常一个特效有三种组件: - Animation - Animator - Partic ...

  10. CodeForces - 1059D(二分+误差)

    链接:CodeForces - 1059D 题意:给出笛卡尔坐标系上 n 个点,求与 x 轴相切且覆盖了所有给出点的圆的最小半径. 题解:二分半径即可.判断:假设当前二分到的半径是 R ,因为要和 x ...