區間最大最小值 ST表

2021-10-09 10:13:22 字數 1206 閱讀 4647

這是一道st表經典題——靜態區間最大值

請注意最大資料時限只有0.8s,資料強度不低,請務必保證你的每次查詢複雜度為 o(1)o(1)。若使用更高時間複雜度演算法不保證能通過。

如果您認為您的**時間複雜度正確但是 tle,可以嘗試使用快速讀入:

inline int read()

while (isdigit(ch))

return x*f;

}

給定乙個長度為 nn 的數列,和 mm 次詢問,求出每一次詢問的區間內數字的最大值。

第一行包含兩個整數 n, mn,m ,分別表示數列的長度和詢問的個數。

第二行包含 nn 個整數(記為 a_iai​),依次表示數列的第 ii 項。

接下來 mm行,每行包含兩個整數 l_i, r_ili​,ri​,表示查詢的區間為 [ l_i, r_i][li​,ri​]

輸出包含 mm行,每行乙個整數,依次表示每一次詢問的結果。

輸入 #1複製

8 8

9 3 1 7 5 6 0 8

1 61 5

2 72 6

1 84 8

3 71 8

輸出 #1複製

997

7987

9

對於30%的資料,滿足: 1 \leq n, m \leq 101≤n,m≤10

對於70%的資料,滿足: 1 \leq n, m \leq ^51≤n,m≤105

對於100%的資料,滿足: 1 \leq n \leq ^5, 1 \leq m \leq 2 \times ^6, a_i \in [0, ^9], 1 \leq l_i \leq r_i \leq n1≤n≤105,1≤m≤2×106,ai​∈[0,109],1≤li​≤ri​≤n

用cin會tle,大資料還是用scanf比較穩。有幾個關鍵的數要記一下。另外《的優先順序比+和-低???不加括號的話會wa。

**

#includeusing namespace std;

int n,m,a,b;

int dp[100005][20];

int len[100005];

void init()

return 0;

}

ST表 (求區間最大 最小值)

st表的功能很簡單 它是解決rmq問題 區間最值問題 的一種強有力的工具 它可以做到o nlogn 預處理,o 1 是查詢最值 像線段樹是o logn 的查詢 st表是利用的是倍增的思想 拿最大值來說 我們用st i j 表示,從i位置開始的2 j個數中的最大值,例如st i 1 表示的是i位置和i...

st表求區間最大值

第一行給出乙個數字n,接下來n 1行,每行給出乙個數字ai,0 i n 1e6 接來給出乙個數字q q 7000 代表有q個詢問 每組詢問格式為a,b即詢問從輸入的第a個數到第b個數,其中的最大值是多少 如題所述 1001 2323 4321 050 10 2 43 7 7 98 8 434 32這...

ST演算法詳解 例題 O(1)查詢區間最大最小值

今天學習的是rmq的st演算法,先說明一下它的適用範圍 複雜度是o nlogn 的建表和o 1 的查詢,並且不適用於更新。如果更新的話就用線段樹了,因為st是直接建表了。ps.1 k 2 k 以最大值為例,最小值的初始化過程相同。首先設a是要求區間最值的數列,f i,j 表示從第i個數起連續 1 j...