2013年1月4日 星期五

[ZJ] 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;
}

沒有留言:

張貼留言