사용법 #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)); } }
균형 잡힌 라인업 poj3264 제목 세그먼트 트리 기준, 최대 및 최소 간격을 추구
추천
출처www.cnblogs.com/hulian425/p/12222308.html
추천
행