의 수보다 큰 및 번호 (펜윅 트리) 미만

1 #INCLUDE <. 비트 / stdc ++ H>
 2  #DEFINE가 긴 긴 버리는
 3은  사용  공간의 성병;
4  INT의 N, m;
5  CONST의  INT의 N = 100005 ;
(6)  LL의 CNT [N], 도착 [N], BRR [N];
7 벡터 <LL> VEC;
8  의 INT getid (LL의 X) { 복귀 LOWER_BOUND (vec.begin () vec.end (), X) -vec.begin () + 1 ; }
 9  INT lowbits ( INT X) { 돌아가 , X - X; }
 10  무효 추가 ( INT의 X,INT의 값) { 동안 (X <= N) CNT [X] + = 값 = X + lowbits (X); }
 11  INT 쿼리 ( INT X) {
 12      INT의 합 = 0 ;
13 일      동안 (x> 0 ) {합계 = + CNT [X], X- = lowbits (X); }
 14      리턴 합;
15  }
 16  INT 의 main () {
 17      는 scanf ( " %의 D ' , N);
(18)      에 대한이 ( int로 I = 1 scanf와 (나 ++; i가 N = <) " %의 LLD를 " ,ARR [I]) vec.push_back (ARR [I])
 . (19)      정렬 (vec.begin () vec.end ()); vec.erase (UNIQUE (vec.begin () vec.end ()) , vec.end ());
 (20)은      LL의 SUM = 0 ]
 (21)가      대해 ( INT I = . 1 <= N-I, I는 ++ ) {
 22은          추가 (getId (ARR [I]) 1이다. )
 (23)는          BRR [I] + 쿼리 I는 (getId (ARR [I])) =;   // 그것의 앞에 I- 이하의 수의 수보다 
24      }
 25  //     (sizeof의 (BRR) BRR, 0)가 memset; 
26은      memset 함수 (CNT, 0 , sizeof의 (CNT)),
 27       ( INT I = N-; I> =1 , 난 - ) {
 28          추가 (getid (도착 [I]), 1 );
29          BRR [내가] + = 쿼리 (getid (도착 [I]) - 1 );   // 后面小于它的个数
 30  //         COUT << BRR [I] << ENDL; 
31      }
 32       ( int로 I = 1 ; i가 N = <; 내가 ++ ) {
 33          합 + = 1LL * ( 1 + BRR [I]) * BRR [I] / 2 ;
34      }
 35      COUT << 합 << ENDL;
36      반환  0 ;
37 }
코드보기

 

추천

출처www.cnblogs.com/qq-1585047819/p/11420383.html