주제 링크 : http://acm.hdu.edu.cn/showproblem.php?pid=6601
질문 의미하는 삼각형의 최대 둘레로 구성된 소정주기의 숫자라고한다.
방법은 일반적으로 두 번째 및 세 번째 가장 큰 후 다음 네 번째로, 5 번을 요청하는지 여부를 판정 만족 큰 부 (1) 요구되는 .....
원래 폭발의 복잡성, 그냥 피보나치 같은 최악의 경우에 대해 생각하는 결과를 찾을 수 있다고 생각, 각 간격은 큰되지 않습니다.
큰 나무 의장은 난의 간격을 설정했다 모집
1 #INCLUDE <알고리즘> 2 #INCLUDE <iostream> 3 #INCLUDE <cstdio> 4 #INCLUDE <벡터> 5 #INCLUDE <CString을> 6 #INCLUDE <큐> 7 이용한 스페이스 성병; 8 타입 정의 긴 긴 LL; 9 CONST의 INT maxn 2E5 + = 3 ; 10 INT A [maxn], B [maxn]; 11 INT의 루트 [maxn, LS [maxn * 20 , RS [maxn * 20 , CNT; 12 LL의 발 [maxn * 20 ]; (13) 보이드 빌드 ( INT의 L, INT R, INT 및 I) { 14 I = ++ CNT; 15 발 [I] = 0ll; 16 의 경우 (L == R) 17 리턴 ; 18 INT 미드 + = 리터의 R >> 1 ; 19 빌드 (좌, 중, LS [I]); 20 빌드 (MID + 1 , R, RS [I]); 21 } 22 무효 업데이트 ( INT의 K, INT의 L, INT R, INT 및 I) { 23 LS [++ CNT = 1! [I], RS [CNT] = RS [I] 발 [CNT] = 브로 [I] + 1 ; 24 I = CNT; 25 의 경우 (L == R) 26 리턴 ; 27 INT 미드 + = 리터의 R >> 1 ; 28 일 경우 (K <= MID) 29 업데이트 (K, L, 미드, LS [I]); 30 다른 31 업데이트 (K, 중간 + 1 , R, RS [I]); 32 } 33 LL 쿼리 ( INT U, INT의 V, INT의 K, INT의 L, INT의 R) { 34 의 경우 (L == R) 35 리턴 L; 36 INT X = 브로 [LS [V] - 브로 [LS [U]; 37 INT 미드 + = 리터의 R >> 1 ; 38 의 경우 (K <= 된 X) 39 리턴 질의 (LS [U] LS [V], K, L, MID); 40 다른 41 리턴 질의 (RS [U], RS [V], K - X, 중간 + 1 , R); 42 } 43 INT 의 main () { 44 INT의 N, m; 45 동안 (는 scanf ( " %의 D % d에 " , N, m)! =EOF) { 46 CNT = 0 ; (47) 에 대한이 ( int로 I = 1 ; i가 N = <; 내가 ++ ) (48) 는 scanf ( " %의 D를 " , A [I]), [I] = B A [I]; 49 정렬 (B + 1 , B + 1 + N); 50 INT의 K = 고유 (B + 1 , B + 1 + N) - B - 1 ; 51 빌드 ( 1 , K, 루트 [ 0 ]); 52 대 ( INT I = 1; 난 = <N; 난 ++ ) { 53 INT의 t = LOWER_BOUND (B + 1 , B + 1 + K, A [I]) - B - 1 ; 54 t ++ ; 55 루트 [I] = 루트 [I - 1 ]; 56 업데이트 (t, 1 , K, 루트 [I]); 57 } 58 대 ( int로 I = 1 ; I <= m; 내가 ++ ) { 59 INT의 L, R; 60 는 scanf ( " % d 개 %의 D ' , L, R); 61 INTLEN = R - L + 1 ; 62 의 경우 (LEN < 3 ) { 63 의 printf ( " -1 \ 없음 " ); (64) 계속 ; 65 } 66 LL의 ANS = - 1 ; 67 LL X = B [쿼리 (루트 [1 - (1) ], 루트 (R), LEN, 1 , K)]; 68 LL의 Y = B [쿼리 (루트 [1 - (1) ], 루트 (R), LEN - 1 , 1 , K)]; 69 대 ( INT I = 3; 난 = LEN을 <; I ++ ) { 70 LL의 Z = B [쿼리 (루트 [1 - (1) ], 루트 (R), LEN - I + 1 , 1 , K)]; 71 의 경우 (X <Y + Z) { 72 의 ANS의 = X + Y + Z; 73 휴식 ; (74) } (75) 또 { 76 , X = Y; (77) Y = Z; 78 } 79 } 80 의 printf ( " % LLD \ 없음 " , ANS); 81 } 82 } 83 84 }