st演算法模板(區間最值)

2021-07-31 07:51:34 字數 591 閱讀 1382

f[1,0]表示第1個數起,長度為2^0=1的最大值,其實就是3這個數。f[1,2]=5,f[1,3]=8,f[2,0]=2,f[2,1]=4……從這裡可以看出f[i,0]其實就等於a[i]。這樣,dp的狀態、初值都已經有了,剩下的就是狀態轉移方程。我們把f[i,j](j≥1)平均分成兩段(因為j≥1時,f[i,j]一定是偶數個數字),從i到i+2^(j-1)-1為一段,i+2^(j-1)到i+2^j-1為一段(長度都為2^(j-1))。用上例說明,當i=1,j=3時就是3,2,4,5 和6,8,1,2這兩段。f就是這兩段的最大值中的最大值。於是我們得到了動規方程f[i,j]=max(f[i,j-1],f[i+2^(j-1),j-1])

k:= trunc(ln(r-l+1)/ln(2));

ans:=max(f[l,k],f[r-2^k+1,k]);

#include#include#define max(x,y)(x>y?x:y)

using namespace std;

int a[100010];

int dp[100010][20];

int main()

for(j=1;j<20;j++)

} for(i=0;i

RMQ(模板 ST 區間最值,區間頻繁次數)

ps 介紹 rmq演算法,是乙個快速求區間最值的離線演算法,預處理時間複雜度o n log n 查詢o 1 所以是乙個很快速的演算法,當然這個問題用線段樹同樣能夠解決。1 求區間的最大值和最小值!如下 include include include include using namespace s...

求解區間最值的ST演算法

作用 st演算法是用來求解給定區間rmq的最值,本文以最小值為例 舉例 給出一陣列a 0 5 則區間 2,5 之間的最值為1。1 離線預處理 運用dp思想,用於求解區間最值,並儲存到乙個二維陣列中。具體解釋 1 離線預處理 st演算法使用dp思想求解區間最值,貌似屬於區間動態規劃,不過區間在增加時,...

ST表演算法(求解區間最值)

如下 bin 0 1 for int i 1 i 20 i bin i bin i 1 2 bin i 表示2的i次方 log 0 1 for int i 1 i 200000 i log i log i 2 1 log i 表示log i for int i 1 i n i mn 0 i a i ...