그러나 모든 삼각형 킨 [2,019 끊기 전기 멀티 보정 번째 필드] hdu6601]

주제 링크 : 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, INTI) {
 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, INTI) {
 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 }

 

추천

출처www.cnblogs.com/sainsist/p/11328824.html