2011-04-07 13:20:59Morris
d539. 區間 MAX
給一個數列T1,T2,T3....Tn ,求 Ta到Tb之間(涵蓋 Ta、Tb)的最大值。
輸入說明
:
每組測資輸入的第一行有一個整數N (1≦N≦50,0000) ,接下來會有N個正整數(int 範圍內)代表T1,T2,T3....Tn
再接下來會有一個整數M(1≦M≦N),代表接下來會有M行詢問的a,b。( a, b 沒說誰大誰小 !)
輸出說明
:
輸出T[a,b]之間的MAX。
範例輸入 :
若題目沒有特別說明,則應該以多測資的方式讀取,若不知如何讀取請參考 a001 的範例程式。
10
3 2 4 5 6 8 1 2 9 7
7
1 5
3 5
1 10
5 8
6 6
2 4
2 9
範例輸出 :
6
6
9
8
8
5
9
/**********************************************************************************/
/* Problem: d539 "區間 MAX" from RMQ */
/* Language: C */
/* Result: AC (84ms, 2600KB) on ZeroJudge */
/* Author: morris1028 at 2011-04-07 13:17:12 */
/**********************************************************************************/
#include<stdlib.h>
#include<stdio.h>
int A[500001], tree[1100001];
int MAX (int x, int y) {
if(x >= y) return x;
else return y;
}
void set_tree(int l, int r, int k) {
if(l == r) tree[k]=A[l];
else {
int m = (l + r)/2;
set_tree(l, m, 2*k);
set_tree(m+1, r, 2*k+1);
tree[k]=MAX(tree[2*k], tree[2*k+1]);
}
}
int get(int l, int r, int k, int x, int y) {
if(l == x && r == y) return tree[k];
else {
int m = (l + r)/2;
if(m >= y) return get(l, m, 2*k, x, y);
else if(m < x) return get(m+1, r, 2*k+1, x, y);
else return MAX(get(l, m, 2*k, x, m), get(m+1, r, 2*k+1, m+1, y));
}
}
int Input() {
char cha;
int x=0;
while( cha = getchar() )
if(cha!=' ' && cha!='\n') break;
x= cha-48;
while(cha=getchar()) {
if(cha==' ' || cha=='\n') break;
x=x*10+cha-48;
}
return x;
}
main() {
int N, a, x, y, M, t;
while(scanf("%d",&N)==1) {
for(a = 1; a <= N; a++)
A[a]=Input();
set_tree(1, N, 1);
scanf("%d", &M);
for(a = 1; a <= M; a++) {
x=Input(), y=Input();
if(x > y) t=x, x=y, y=t;
printf("%d\n",get(1, N, 1, x, y));
}
}
return 0;
}
上一篇:a091. 今晚打老虎
下一篇:d747. 迷宮路徑