균형 잡힌 라인업 poj3264 제목 세그먼트 트리 기준, 최대 및 최소 간격을 추구

사용법 #include <iostream> 
#INCLUDE < 문자열 > 
#INCLUDE <cstdlib> 
#INCLUDE <알고리즘> 
#INCLUDE <cstdio>
 사용  공간이 수 std;
CONST  INT N = 1E5 + 5 ;
구조체 노드 
{ 
    INT의 L, R;
    INT minn에 maxn; 
} 트리 [N * 3 ];
int로 A [N]을;
보이드 빌드 ( INT I, INT (L) 의 INT R) 
{ 
    트리 [I] 펜닐 = L; 
    트리 [I] .R= R;
    경우 (L == R) 
    { 
        트리 [I] .maxn = A [L]; 
        트리 [I] .minn = A [L];
        반환 ; 
    } 
    INT 중간 = (L +의 연구) >> 1 ; 
    빌드 (I << 1 , L, MID); 
    빌드 (I << 1 | 1 , 중반 + 1 , R); 
    트리 [I] .maxn = 최대 (트리 [I << 1 ] .maxn, 트리 [I << 1 | 1 ] .maxn); 
    트리 [I] .minn = 분 (트리 [I << 1 ] .minn, 트리 [I <<1 | 1 ] .minn); 
} 
INT Querymax ( INT 내가 int로 하는을 INT의 B)을 
{ 
    경우 (A == 트리 [I] 펜닐 && B == 트리 [I] .R) 
    { 
        복귀 트리 [I] .maxn; 
    } 
    INT의 중간 = (트리 [I] 펜닐 트리 + [I] .R) >> 1 ;
    경우 (b <= MID) Querymax (I << 1 , A, B);
    다른  경우 (a> MID) Querymax (I << 1 | 1 , A, B);
    
    { 
        복귀 맥스 (Querymax (I << 1 , A, MID), Querymax (I << 1| 1 , 중간 + 1 , b)); 
    } 
} 

INT Querymin ( INT 내가 int로 하는을 INT의 B)을 
{ 
    경우 (A == 트리 [I] 펜닐 && B == 트리 [I] .R) 
    { 
        복귀 트리 [I] .minn; 
    } 
    INT의 중간 = (트리 [I] 펜닐 트리 + [I] .R) >> 1 ;
    경우 (b <= MID) Querymin (I << 1 , A, B);
    다른  경우 (a> MID) Querymin (I << 1 | 1 , A, B);
    
    { 
        리턴 분 (Querymin (I << 1A, MID), Querymin (I << 1 | 1 중간 + 1 , b)); 
    } 
} 

int 형 ) (주 
{ 
    INT를 N, Q; 
    scanf와 ( " % D % D " , N, Q);
    위한 ( INT 난 = 1 ; I <= N; I ++ ) 
    { 
        scanf와 ( " 가 % d " , & A [I])를; 
    } 
    빌드 ( 1 , 1 , N);
    위한 ( INT 난 = 0 ; I <Q를, I ++ ) 
    {
        INT T1, T2; 
        scanf와 ( " % D % D ' , T1, T2); 
        의 printf ( " 가 % d \ n " , Querymax ( 1 , T1, T2) -Querymin ( 1 , T1, T2)); 

    } 
}

 주제 링크 http://poj.org/problem?id=3264

추천

출처www.cnblogs.com/hulian425/p/12222308.html