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...