日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RMQ问题-ST表倍增处理静态区间最值

發布時間:2023/12/2 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RMQ问题-ST表倍增处理静态区间最值 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

?

ST表是利用倍增思想處理RMQ問題(區間最值問題)的一種工具。 它能夠做到O(nlogn)預處理,O(1)查詢的時間復雜度,效率相當不錯。

算法

?

1.預處理

ST表利用倍增的思想。以洛谷的P3865作為例子。我們需要查詢某一區間的最大值。 我們用f[ i ][ j ]表示區間i到i+2^j-1的最大值(最小值同理)。在狀態轉移時,我們可以把這個區間拆成兩個區間,分別求最大值。??因此,狀態轉移方程為:

f[i][j] = max{ f[i][j-1], f[i+2^(j-1)][j-1] }

2.查詢

查詢也比較簡單。 我們先求出log2(區間長度),令其等于k。??然后,我們對左右端點分別查詢(即圖中的綠色線條和紅色線條),保證能夠覆蓋我們需要查詢的整個區間。

為什么從右端點開始查詢,左端點為r-2^k+1? 其實很簡單,我們需要尋找一個x,使得x+2^k-1=r。所以x=r-2^k+1。

上代碼:

?

//ST表求靜態區間最大值 洛谷P3865 #include <iostream> #include <cstdio> #include <cmath>using namespace std;const int maxn=1e6+10; int n,m; int Max[maxn][21];//Max[i][j]表示區間i到i+2^j-1的最大值int read() {char ch=getchar();int f=1;int x=0;while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f; }int find(int l,int r) {int k=log2(r-l+1);//計算log2(區間長度)return max(Max[l][k],Max[r-(1<<k)+1][k]); }int main() {n=read();m=read();for(int i=1;i<=n;i++){Max[i][0]=read();}for(int j=1;j<=21;j++){for(int i=1;i+(1<<j)-1<=n;i++){Max[i][j]=max(Max[i][j-1],Max[i+(1<<(j-1))][j-1]);//倍增//1<<(j-1)表示2^(j-1) }}for(int i=1;i<=m;i++){int l=read();int r=read();printf("%d\n",find(l,r));}return 0; }

?

轉載于:https://www.cnblogs.com/Bw-Orzzzzz/p/10829036.html

總結

以上是生活随笔為你收集整理的RMQ问题-ST表倍增处理静态区间最值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。