![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }