不滅のタイトル。
ポジティブ・ソリューションズの著者:
アルゴリズム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 対< INT、INT >尋ねる(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 対< INT、INT > TEM = le.ask(POS)。 42の ANS + = tem.second *(MAXH-X) - tem.first。 43 対< INT、INT > 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))ボイドリード(INT&S) 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 }