その数よりも大きいとその数(フェンウィック木)よりも小さいです

1つの#include <ビット/ STDC ++ H>
 2  の#defineは長い長いっ
 3が 使用 名前空間STDを、
4  int型N、M。
5  のconst  int型 N = 100005 6  LLのCNT [N]、ARR [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 メイン(){
 17      のscanf(" %d個"、&N)
18      のためにint型 i = 1 ; iが<= N; iが++)のscanf(" %の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  //     のmemset(BRR、0、はsizeof(BRR)); 
26れます      memset(CNT、0はsizeof (CNT));
 27      のためにINT I = N-; I> =1 ; i-- ){
 28          追加(のgetId(ARR [i])と、1 );
29          BRR [I] + =クエリ(のgetId(ARR [I]) - 1)。   // 后面小于它的个数
 30  //         COUT << BRR [I] << ENDL。
31      }
 32      のためのint型 i = 1 ; iが<= N; iが++ ){
 33          和+ = 1LL *(1 + BRR [I])* BRR [I] / 2 34      }
 35      COUT <<和<< ENDL。
36      リターン 0 37 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/qq-1585047819/p/11420383.html