順列0〜N-1が最小を逆に求めて、一体的に移動することができる与えます
数字はNUM [I] [i]は、ツリー状のn-NUMの配列に相当するプラス1ビットで添加します
NUM [I]は、最初であるので、(N-1)-num [I] + 1 = N-NUM [i]が多数、逆の順序を生成、数字だけが挿入されている可能性の前に、この時間間隔クエリ直接すなわち缶
1の#include < セット > 2の#include <マップ> 3の#include <cmath> 4の#include <キュー> 5の#include <ベクトル> 6の#include <cstdioを> 7の#include <cstdlib> 8の#include <CStringの> 9# <入出力ストリーム>含む 10の#include <アルゴリズム> 11 使用 名前空間STDを、 12 CONST INT MAXN = 5001 。 13 INT [MAXN]、N、T = 1 、T。 I& - I;} 15 ボイドのinit(){memsetの(0、はsizeof ());} 16 空隙追加(INT iは、INT V){ ため(; I <= N; [I] + = V 、I + = LB(I));} 17 int型の和(INT I){ int型 ANS = 0。用(; I; ANS + = A [i]は、I- = LB(I))。リターンANS;} 18 int型の照会(INT I、int型の J){ 戻り和(J)-sum(I- 1 );} 19 20 のint NUM [MAXN]、CNT、ANS。 21 INT メイン(){ 22 ながら(scanf関数(" %dの"!、&N)= EOF){ 23 のinit()、CNT = 0 。 24 のために(INT iは= 1 ; iが<= N; I ++)のscanf(" %dの"、およびNUM [I])。 25 のために(INT iは= 1 ; iが<= N; I ++)CNT + =クエリ(1、N-NUM [I] - 1)、追加(N-NUM [i]は、1 )。 26 ANS = CNT。 27 のための(int型 I = 1; I <N; I ++ ){ 28 アド(N-NUM [i]は、 - 1 )。 29 CNT + =クエリ(1、N-NUM [I] - 1) - NUM [I]。 30 追加(N-NUM [i]は、1 )。 31 ANS = 分(ANS、CNT)。 32 } 33 COUT << ANS << ENDL。 34 } 35 リターン 0 。 36 }