51Nod 1174 區間中最大數

2021-07-15 14:41:06 字數 1292 閱讀 4181

acm模版

給出乙個有n個數的序列,編號0 - n - 1。進行q次查詢,查詢編號i至j的所有數中,最大的數是多少。

例如: 1 7 6 3 1。i = 1, j = 3,對應的數為7 6 3,最大的數為7。(該問題也被稱為rmq問題)

input

第1行:1個數n,表示序列的長度。(2 <= n <= 10000)

第2 - n + 1行:每行1個數,對應序列中的元素。(0 <= s[i] <= 10^9)

第n + 2行:1個數q,表示查詢的數量。(2 <= q <= 10000)

第n + 3 - n + q + 2行:每行2個數,對應查詢的起始編號i和結束編號j。(0 <= i <= j <= n - 1)

output

共q行,對應每乙個查詢區間的最大值。

input示例

5 1

7 6

3 1

3 0 1

1 3

3 4output示例

7 7

3該問題被稱為rmq問題,解決此類問題一般有四種:

1、樸素,也就是搜尋;

2、線段樹;

3、st,實質上就是動態規劃;

4、rmq標準演算法。

對於這種資料範圍的題,樸素是肯定不行的,這裡我們使用的是st演算法。

#include 

using

namespace

std;

/* * 求最大值,陣列下標從1開始。

* 求最小值,或者最大最小值下標,或者陣列從0開始對應修改即可。

*/const

int maxn = 10010;

int dp[maxn][20];

int mm[maxn];

// 初始化rmq,b陣列下標從1開始,從0開始簡單修改

void initrmq(int n, int b)

for (int j = 1; j <= mm[n]; j++)

}}// 查詢最大值

int rmq(int x, int y)

int main(int argc, const

char * argv)

initrmq(n, b);

int q;

cin >> q;

int left, right;

for (int i = 0; i < q; i++)

return

0;}

《rmq》

51Nod 1174區間中最大值

題目要求,先輸入乙個陣列,然後求出陣列中某乙個區間中的最大值。是不是覺得,我就直接用for迴圈就可以寫啦,賊好寫。這樣子講吧,如果你只搜尋一次的話,是看不出什麼區別的,但是如果你要搜尋m次,m又很大呢?每一次都要用迴圈去乙個乙個比較嗎?o n m 的時間複雜度是不是會讓你體驗極差 這個題目在經過自己...

51Nod 1174 區間中最大的數

給出乙個有n個數的序列,編號0 n 1。進行q次查詢,查詢編號i至j的所有數中,最大的數是多少。例如 1 7 6 3 1。i 1,j 3,對應的數為7 6 3,最大的數為7。該問題也被稱為rmq問題 第1行 1個數n,表示序列的長度。2 n 10000 第2 n 1行 每行1個數,對應序列中的元素。...

51nod 1174 區間中最大的數

1174 區間中最大的數 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 收藏關注給出乙個有n個數的序列,編號0 n 1。進行q次查詢,查詢編號i至j的所有數中,最大的數是多少。例如 1 7 6 3 1。i 1,j 3,對應的數為7 6 3,最大的數為7。該問題也被稱為r...