這是一道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輸出 #1複製9 3 1 7 5 6 0 8
1 61 5
2 72 6
1 84 8
3 71 8
997對於30%的資料,滿足: 1 \leq n, m \leq 101≤n,m≤107987
9
對於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...