HDU-4417 - 슈퍼 마리오 (트리 솔루션의 회장)

마리오는 세계적으로 유명한 배관공입니다. 그의 "억센"그림과 우리의 기억에 상기시켜 놀라운 점프 능력. 이제 가난한 공주는 다시 곤경에 마리오는 그의 연인을 저장해야합니다. 우리는 높이 인사에 벽돌이 모든 정수 POINT I에, 선 (길이가 n은)로 보스의 성으로가는 길을 생각. 이제 문제는 그가 이동할 수있는 최대 높이가 H. 경우 많은 벽돌에 [L, R] 마리오 칠 수있는 방법입니다

제 InputThe 라인 정수 T, 테스트 데이터의 수에 따른다. 
각각의 테스트 데이터의 경우 : 
첫 번째 라인은 N, m은 (1 <=는 N <= 10 ^ 5, 1 <= m <= 10 ^ 5) N 도로의 길이, m은 쿼리의 개수 두 정수를 포함 . 
다음 라인은 범위 [0, 1000000000]이고, n은 정수, 각 벽돌의 높이를 포함한다. 
. 다음에 m 행, 각 라인은 세 개의 정수 L, R, H (0 <= L <= R <n은 0 <= H <= 1000000000.)를 OutputFor 각각의 경우, 출력 "케이스 X를"포함 (X 사건 번호는 m 행 하였다 1)에서 시작하여, 각각의 라인은 정수를 포함한다. i 번째 정수 마리오 i 번째 쿼리 칠 수 벽돌의 수입니다. 
샘플 입력

1 
10 10 
0 7 5 2 5 4 3 8 7 7 
2 8 6 
3 5 0 
1 3 1 
1 4 9 
0 0 1 
3 5 5 
5 5 1 
4 6 3 
1 5 7 
5 7 3

샘플 출력

. 1 예 : 
. 4 
0 
0 
. 3 
. 1 
2 
0 
. 1 
. 5 
. 1 

K에 동일한 간격을 찾는 우리 R 세그먼트 트리 버전을 이동 수 질의의 수보다 적은 - 세그먼트 트리의 L-1 번호의 첫 번째 버전
번호 :
#INCLUDE <cstdio> 
#INCLUDE <iostream> 
#INCLUDE <CString을> 
#INCLUDE <알고리즘> 
#INCLUDE <큐> 
#INCLUDE <적층> 
#INCLUDE < 설정 > 
#INCLUDE <지도> 
#INCLUDE <벡터> 
#INCLUDE <cmath> CONST의 INT maxn 1E5 + = 5 ; 
타입 정의 LL;
사용하는 네임 스페이스 표준을;
구조체 노드 
{ INT의 L, R;
    INT 합; 
} 트리 [maxn * 20 ];


   
    INT CNT 루트 [maxn];
INT A [maxn]; 
벡터 < INT > V;
INT getid ( INT X) 
{ 
    복귀 LOWER_BOUND (v.begin () v.end (), X) -v.begin () + 1 ; 
} 
공극 빌드 ( INT 및 U, INT의 L, INT의 R) 
{ 
    U = ++ CNT; 
    트리 [U] .sum = 0 ;
    경우 (L == R) ;
    int로 중간 = (L + R) / 2 ; 
    (트리 [U] 펜닐, L, 미드)를 작성;
    구축 (트리 [유] .R, 중반 + 1 , R); 
} 
공극 업데이트 ( INT의 L, INT의 R, INT의 전, INT 현재 및, INT의 P) 
{ 
    트리 [ ++ CNT = 트리 [중고]; 
    이제 = CNT는; 
    트리 [지금] .sum ++ ; 
    경우 (L == R)이 
    { 
        리턴 ; 
    } 
    INT 중간 = (L + R) >> 1 ;
    경우 (p <= MID) 
    { 
        업데이트 (좌, 중, 트리 [중고] 펜닐, 트리 [현재] 펜닐, P); 
    } 
    다른 
    { 
        갱신 (중간 +1 , R, 트리 .R, 목 [현재] .R, P [중고]); 
    } 
} 
INT의 쿼리 ( INT의 L, INT의 R, INT의 L, INT의 R, INT의 K) 
{ 
  경우 (L == R) 
  { 
      복귀 트리 [R] .sum- 트리 [L] .sum; 
  } 
  INT 중간 = (L + R) >> 1 ;
  경우 (K <= MID) 
  { 
      리턴 질의 (좌, 중, 트리 [L] 펜닐, 트리 [R] 펜닐, K); 
  } 
  다른 
  { 
      LL ANS = 나무 [나무 [R] .L] .sum-의 트리 [트리 [L] 펜닐] .sum;
    ANS + = 쿼리 (MID + 1, R, 트리 [L] .R, 목 [R] .R, K);
    반환 ANS를; 
  } 
} 
INT 의 main () 
{ 
    INT의 T; 
    CIN >> T;
    INT의 CC = 1 ;
    반면 (T-- ) 
    { 
      INT의 N, m; 
      scanf와 ( " %의 D % d에 " , N, m); 
      CNT = 0 ;
       ( INT의 t = 1 , t <= N; t ++ ) 
      { 
          v.clear (); 
      } 
       ( INT t =1 ; t <= N; t ++ ) 
      { 
          scanf와 ( " 가 % d " , & A [t]); 
          v.push_back (a [t]); 
      }     
      
      종류 (v.begin (), v.end ()); 
      v.erase (고유 (v.begin () v.end ()) v.end ()); 
      빌드 (루트 [ 0 ] (1) , N);
       ( INT의 t = 1 , t <= N; t ++ ) 
      { 
          업데이트 ( 1 N, 루트 [T- 1 , 루트 [t] getid (a [t])); 
      } 
      INT의 X, Y, K; 
      의 printf ( " 케이스가 % d : \ n " , CC ++ )
       동안 (M-- ) 
      { 
          는 scanf ( " % D % D % D ' , X, Y, K); 
          K = UPPER_BOUND (v.begin () v.end () , K) - v.begin ()
           경우 (케이 == 0 ) 
          { 
              둔다 ( " 0 " )
               계속 ; 
        } 
          X ++ ; 
          Y ++ ] 
          의 printf ( " % D \ 없음 " 쿼리 ( 1 , N 루트 [X- 1] 루트 [Y, K)); 
      } 
    } 
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/Staceyacm/p/11307906.html