무게 세그먼트 트리 루오 밸리 1168

이 질문은 트리 선 두께 연습보다 더 많은 것 같습니다;

하지만 데이터가 1E9에 열려 있기 때문에, 트리 라인을 해결하기 위해 가중치를 사용하고, 그래서 이산해야합니다.

각 노드에 포함 된 이산화의 후, 제 크기 범위의 디지털 기록 빌드

그런 다음 천천히 성과, 프로세스, 하나의 숫자, 그것은 쿼리 할 때 업적;

1 #INCLUDE <cstdio>
 2 #INCLUDE <알고리즘>
 3 #INCLUDE <math.h>
 4 #INCLUDE < 문자열 .H>
 5 #INCLUDE <큐>
 6  이용한  스페이스 성병;
7  CONST의  INT maxn 1E5 + = 10 ;
8  int로 A [maxn], B [maxn];
9  구조체 노드
 10  {
 11      INT의 L, R, 미드;
12      의 INT NUM;
13 } 트리 [maxn << 2 ];
(14)  무효 빌드 ( INT의 L, INTR, INT CUR)
 15  {
 16      트리 [CUR] 펜닐 = L, 트리 [CUR] .R = R;
17      트리 [CUR] .num = 0 ;
18      트리 [CUR] .MID = (L + R) / 2 ;
19      의 경우 (L == R) ;
20      빌드 (L, 트리 [CUR] .MID, CUR << 1 );
21      빌드 (트리 [CUR] .MID + 1 , R, CUR << 1 | 1 );
22  }
 23  무효 업데이트 ( INT의 POS, INT CUR)
 24  {
 25     트리 [똥개] .num ++ ;
26 일      경우 (트리 [CUR] 펜닐 == 트리 [CUR] .R) ;
27 일      경우 (POS <= 트리 [CUR] .MID)
 28          업데이트 (POS, CUR << 1 );
29      다른 업데이트 (POS, CUR << 1 | 1 );
30  }
 31  INT 쿼리 ( INT  베이스 , INT CUR)
 32  {
 33      의 경우 (트리 [CUR] 펜닐 == 트리 [CUR] .R) 복귀 트리 [CUR] 펜닐;
34      의 경우 ( 베이스 <= 트리 [CUR << 1] .num)  (쿼리 ( 베이스 , CUR << 1 ));
35      다른   (쿼리 ( 베이스 - 트리 [CUR << 1 ] .num, CUR << 1 | 1 ));
36  }
 37  INT의 주 ()
 38  {
 39      INT N;
40      는 scanf ( " %의 D ' , N);
(41)      에 대한이 ( int로 I = 1 난 ++; i가 N = < {)
 (42)          는 scanf ( " %의 D를 " ,일체 포함]);
43          B [I] = A [I];
44      }
 45      정렬 (B + 1 , B + 1 + N);
46      INT의 t = 고유 (B + 1 , B + 1 + N) -B- 1 ;
47      빌드 ( 1 N, 1 );
(48)      에 대한이 ( int로 I = 1 ; i가 = <N; i가 ++ ) {
 49          INT의 POS LOWER_BOUND = (B + 1 , B + 1 + t, A [I]) - B;
50          업데이트 (POS, 1 );
(51)          의 경우(I %의 2 )의 printf ( " % D \ 없음 " , B [쿼리 (I / 2 + 1 , 1 )]);
52      }
 53      반환  0 ;
54 }

 

추천

출처www.cnblogs.com/pangbi/p/11517527.html