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 }