hdu1394-最小反転ナンバー[データ構造] [フェンウィックツリー] - C ++

順列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 }

 

おすすめ

転載: www.cnblogs.com/JasonCow/p/12289625.html