題目意為給定一串陣列,求某個區間範圍內的最大值和最小值之差。
由於詢問數量較多,並且也不涉及更新值,所以使用st求rmq預處理最大和最小。
此題用來學習st演算法,j表示包含i的i後2^j個數的最大值,可以知道,dp[i][j]可以被拆分成兩部分dp[i][j - 1]和dp[i + (1<<(j - 1))][j - 1]這樣就可以更新出所有的dp。詢問時只要求出乙個最大的j使y - x + 1大於2^j即可將詢問拆分成dp[x][j]和dp[y - (1<< j) + 1][j]。o(1)查詢就實現了。
#include
#include
#include
#include
#include
#define rep(i, s, t) for(int i = s;i <= t;i++)
#define rap(i, s, t) for(int i = s;i >= t;i--)
using
namespace
std;
int n, q;
int a[50004];
int maxx[50004][32], minx[50004][32];
void st(int n)
int k = log(n * 1.0) / log(2.0);
rep(j, 1, k)
}}int get_ans(int x, int y)
int main()
memset(maxx, 0, sizeof(maxx));
memset(minx, 0, sizeof(minx));
st(n);
rep(i, 1, q)
}return
0;}
RMQ問題ST演算法 POJ 3264
st演算法o nlogn 預處理,o 1 的查詢指定區間的最值 以最小值為例 基本上是把待求區間 l,r 分為兩段長為len的區間 左邊一段為 l,l len 1 右邊一段為 r len 1,r len必須使得兩段區間覆蓋待求區間 設所求陣列為w 那麼,所求最小值就是兩個區間的最小值間的最小值 即m...
rmp演算法詳細介紹 poj3264
rmq range minimum maximum query 問題 rmq問題是給定乙個區間,求這個區間中的最大或最小值的問題 rmq採用動態規劃的思想來求解 st演算法 square table 預處理 預處理使用 dp的思想,f i,j 表示 i,i 2 j 1 區間中的最小值。例如,f 0,...
對於POJ3264的思考
嗯嗯poj3264就是你啦 題目大意 給定區間多次求區間最大值最小值之差 線段樹維護 開始寫了,但願能跑個好名次嘿嘿嘿 北大郭老 郭煒 的歷程用堆式線段樹,那好吧,那我也寫堆式的正好不用指標了 不過他的歷程足足跑了3秒我覺的不太靠譜阿你說呢 結果 我只比他少了200ms還是資料讀入優勢 includ...