[***] HZOJヒストグラム

不滅のタイトル。

ポジティブ・ソリューションズの著者:

アルゴリズムII:のためにデータの60%屋根の直接列挙の位置を考慮して、トータルコストと屋根の高さの関係は単峰性関数であり,,我々は屋根の高さの3分の2、三分割法を使用することができる。時間の複雑さはO(n 2 * logN個)。 

 

アルゴリズム3:のためのデータの100%:   私たちは、屋根の位置と実践の後、三分の一の高さを列挙し、ボトルネックはコストの計算の複雑さにあります。仮定する屋根は I、高さH、I、J場合<I、そこ H J -J = H iは、 -iは、Jは、場合>iが、そこ H J + J = H iが Iを+。

ソート重量と解決するためにフェンウィックツリーを構築するために重みに従って 2つのフェンウィックツリーを維持し、私の重量との関係。時間の複雑さ O(N(LOGN)(logv )、Vは、 屋根の高さです

 

データの約60%の場合は、2プラクティスは、次のとおりです。

1.問題の著者ソリューションとして、それはかなり明らかです。

2.その後、屋根の高さが、後に証明することが決定され、屋根のように決定された位置のために考えてみましょう。各スポットの高さを加えたシーケンス後の中央値の高さに屋根からの距離、アニール処理をシミュレートすることができるようになっています。

データの100%に:

1.シミュレーテッドアニーリングは、(人と呼ばれます)。

屋根、三分の一の高さを列挙した後、メイン最適化は、計算の支出です。次の2つのフェンウィックツリーを維持することができます。

時間はグーうちの残りの部分の前にタイトなので......

 

1の#include <アルゴリズム>
 2の#include <iostreamの>
 3の#include <cstdioを>
 4の#include <cmath>
 5  の#define INT LL
 6  の#define LL長い長い
 7  の#define MAXN 100010
 8  の#define REGレジスタ
 9  の#defineコンCONST
 10  使って 名前空間はstdを、
11  構造体ノード
 12  {
 13      INT ヴァル、ID。
14      フレンドブール 演算子 < (ノードA、ノードB)
 15      {戻り(a.val ^ b.val)をa.id <b.id:a.val <?b.val;}
 16  }ら[MAXN]、[MAXN] AR。
17  int型N、[MAXN]、MAXH、RKL [MAXN]、RKR [MAXN]。
18  の#define lowbit(X)((X)および( - (X)))
 19  構造体ビット
 20  {
 21      INT C [MAXN]、NUM [MAXN]。
22      ボイド追加(REGの整数 X、REGコンINTの Y、REG CON INT Z)
 23      { 一方(X <= N){C [X] + = Y; NUM [X] + = Z、X + = lowbit(X) ;}}
 24      対< INTINT >尋ねる(REG int型X)
25      {
 26          int型の和= 0、NNUM = 0 27          一方、(X)
 28          {
 29              和+ = C [X]。
30              NNUM + = NUM [X]。
31              X- = lowbit(X)。
32          }
 33          リターンmake_pair(和、NNUM)。
34      }
 35  }ル、再。
36 __attribute((always_inline))INT  得る(REG CON INT X、REG CON INT MAXH)
 37  {
 38      INTANS = 0 ;
39の      + = ABS ANS(maxh- A [X])。
40      int型の POS = UPPER_BOUND(AL + 1、アル+ N + 1、(ノード){MAXH-X、X}) - AL- 1 41      対< INTINT > TEM = le.ask(POS)。
42の      ANS + = tem.second *(MAXH-X) - tem.first。
43      対< INTINT > tem2 = le.ask(N)。
44の      ANS + = tem2.first-tem.first-(tem2.second-tem.second)*(maxh- X)。
45台の      POS = UPPER_BOUND(AR + 1は、Ar + N + 1(ノード){MAXH + X、X}) - AR- 1 46      TEM = re.ask(POS)。
47の      ANS + = tem.second *(MAXH + X) - tem.first。
48      tem2 = re.ask(N)。
49      ANS + = tem2.first-tem.first-(tem2.second-tem.second)*(MAXH + X)。
50の     リターンANS;
51  }
 52 __attribute((always_inline))ボイドリード(INTS)
 53  {
 54      のS = 0 55      REGのint型、F = 1 ; REG チャー A = GETCHAR()。
56      ながら(< ' 0 ' || A> ' 9 '){ 場合(A == ' - ')、F = - 1 ; = GETCHAR();}
 57      ながら(> = ' 0 ' && <= ' 9 '){S = sの* 10 + A- ' 0 ' ; = GETCHAR();}
 58      、S * = F。
59  }
 60は、 メイン()符号付き
 61  {
 62      リード(n)を、
63      int型 ANS =0x7ffffffffffff ;
64      のために(REGのint型 I = 1 ; I <= N; ++ I)
 65      {
 66          リード([I])。
67          ら[I] .val = [I] -i、文献[I] .ID = I。
68          AR [i]は.valが= [I] + I、AR [i]は.ID = I。
69      }
 70      ソート(AL + 1、アル+ N + 1 )。
71      ソート(AR + 1は、Ar + N + 1 )。
72      のために(REGのint型 I = 1 ; I <= N; ++ I)RKL [ら[I] .ID] = I、RKR [AR [I] .ID] = I。
73      のための(REGのINT I = 1 ; I <= N; ++ I)re.add(RKR [I]、[I] + I、1 )。
74      のために(REGのint型 I = 1 ; I <= N; ++ I)
 75      {
 76          re.add(RKR [I] - [I] -i、 - 1 )。
77          int型 L = MAX(I、N-I + 1)、R = 1E9、ML、MR。
78の          ANS =分(ANS、取得(I、L))。
79          一方、(R> L + 1 80          {
 81              INT半ば=(L + R)>> 1 82              mlの半ば= 1、MR = ミッド;
83              INT ANS1 = GET (I、ミリリットル)、
 84                  ANS2 = GET (I、MR)。
85              であれば、R =(ANS1 <ANS2)ミッド。
86              リットル= ミッド;
87の              ANS = 分(ANS、ANS1)。
88の              ANS = 分(ANS、ANS2)。
89              もし(!!(ミリリットル^ L)&&(MR ^ R))休憩90          }
 91          le.add(RKL [I]、[I] -i、1 )。
92      }
 93      のprintf(" %LLDする\ n " 、ANS)。
94 }
コードの表示

 

 

 

 

 

 

おすすめ

転載: www.cnblogs.com/Al-Ca/p/11318851.html