如何快速求解rmq問題呢?暴力複雜度o(n),線段樹複雜度o(n)~o(logn),要是資料規模達到10^7或者更高呢?我們需要一種可以做到o(1)查詢的演算法,這時就可以用到st表。
我們用f[i][j] 表示從 j 位置開始往右 2^i 個數內的最大值,用 g[i][j] 表示從j位置開始往左 2^i 個數內的最大值。所以f[0][j] , g[0][j] 就為 j 位置上的數,可以在預處理中o(n)處理掉。
接下來我們要求出每個位置的每個 2^i 區間的最大值。可以簡單想到, f[1][j] = max( f[0][j] , f[0][j+1] ) , f[2][j] = max( f[1][j] , f[1][j+2]) , f[3][j] = max( f[2][j] , f[2][j+4] ) , ...... , 可以得出,f[i][j] = max( f[i-1][j] , f[i-1][j+(1<<(i-1))] ) , 同理可得, g[i][j]= max( g[i-1][j] , g[i-1][j-(1<<(i-1))] )。
對於每個查詢有左端點l和右端點r,對於左端點l,從l開始能覆蓋的最廣而不超過右端點的倍增次數為log2(r-l+1),從右端點開始能覆蓋的最廣而不超過右端點的倍增次數也為log2(r-l+1),所以在[l,r]範圍內最大值就為max( f[log2(r-l+1)][l] , g[log2(r-l+1)][r] ),這樣我們就做到了o(1)查詢。
每天,農夫 john 的n(1 <= n <= 50,000)頭牛總是按同一序列排隊. 有一天, john 決定讓一些牛們玩一場飛盤比賽. 他準備找一群在對列中為置連續的牛來進行比賽. 但是為了避免水平懸殊,牛的身高不應該相差太大. john 準備了q (1 <= q <= 180,000) 個可能的牛的選擇和所有牛的身高 (1 <= 身高 <= 1,000,000). 他想知道每一組裡面最高和最低的牛的身高差別. 注意: 在最大資料上, 輸入和輸出將占用大部分執行時間.
* 第一行: n 和 q. * 第2..n+1行: 第i+1行是第i頭牛的身高.
* 第n+2..n+q+1行: 兩個整數, a 和 b (1 <= a <= b <= n), 表示從a到b的所有牛.
*第1..q行: 所有詢問的回答 (最高和最低的牛的身高差), 每行乙個.
6 3173
4251 5
4 62 263
0題解:用st表算出各個區間的最大值、最小值即可。
ac**:(寫複雜了但也懶得改了)
1 #include 2 #include 3 #include 4using
namespace
std;
5int
n,q;
6int h[50010];7
int to_r_max[16][50010],to_l_max[16][50010];8
int to_r_min[16][50010],to_l_min[16][50010];9
intmain()
20for(int i=1;i<=q;++i)
28return0;
29 }
講一講IP位址
ip位址組成ip位址分類 為了適應不同的網路,ip位址空間被分為5類,分別是a,b,c,d和e類,其中a,b,c類最常用,d類用於組播,e類用於科研。從上述 中可以看到,每個網路中的主機數都是2 主機位 2,那是因為網路中有一些位址被保留,不能分配給網路使用,有哪些保留位址呢?其實主要有兩類,一類叫...
講一講抽象工廠模式
1.新建產品族介面 我這裡可以理解為生產乙個產品需要兩個步驟 步驟1 public inte ce iproduct1 步驟2 public inte ce iproduct2 2.新建工廠介面 乙個工廠生產乙個產品都需要這兩個步驟 public inte ce ifactory 3.新建各個產品的...
說一說 r與 n
今天在用python讀取txt檔案的時候,遇到了乙個比較坑的問題,那就是 n 和 r 究竟有什麼區別?在計算機還沒有出現之前,人們設計了一種機器叫做電傳打字機,這種機器每秒鐘可以打10個字元。不過它有個問題,就是打完一行換行的時候,需要0.2s,正好可以列印兩個字元,如果這個時候有新的字元傳過來,那...