hdu3507

[I] =分{F [J] +([I]和-sum [J])^ 2 + M}再帰式fを得ることが困難。

そして、拡張分の除去機能:F [I] = F [J] +和[I] ^ 2-2 *和[I] *和[J] +和[J] ^ 2 + M

F [J] +和[J] ^ 2 = 2 *和[I] *和[J] + F [I:用語及び用語を含むことjと左側に書かれたj個のアイテムを含む単純なを含む単離されました] -sum [I] ^ 2-mの

今F [J] +和[J] ^ 2見Y、2 *合計は[i]は見kはxと考え、和[J]、F [i]は-sum [I] ^ 2-mが見B。

各点([J]和f [j]は、+和[J] ^ 2)に固定されているため、2 * [i]との和は、各I、傾き固定されており、切片をb。

小さいB、F [i]が小さいです。我々は、画像のように理解することができる:2 *和の傾き[i]の行は最初の点は答えで掃引する、底部から上方にスイープ。

私たちは、隣接点間の傾きを維持し、キューを構築します。単調に増加する傾きが保証できる場合は、スロープを満たすために最初は2 *合計よりも大きい[i]の結果です。

2 *合計[i]をので単調ので、それがない以上、チームよりもあり、増加しています。時間の複雑さのN.

#include <ビット/ STDC ++。H>
名前空間の使用はstdを。
#define int型はlong long
const int型MAXN = 500000 + 10 
整数N、M、X、S [MAXN]、F [MAXN]、Q [MAXN]。
yvalを指定します(あなたは、取得Y){ リターンF [Y] -f [X] + S [Y] * S [Y] -s [X] * S [X]。 } // y座標の差分を計算します XVALがint(int型のx、int型であるY){戻りS [Y] - S [X];} // x座標)(符号付きの主な違いを{ながら(CIN >> N-計算m)を{ため(INT I = 。1; I <= N; I ++ ){scanfの( "%のLLD"、およびX)、S [I] = S [I-1] + X;}のmemset(F、は0x3F、はsizeof (F));のmemset( Q、0、はsizeof (Q)); INT L = 1は、R = 1。。; Q [L] = 0、F [0] = 0 ;(INT I = 1; I <= N; I ++ ){一方( L <R&LT && yvalを指定している(Q [L]、Q [L + 1])<= XVALは(Q [L]、Q [L用+ 1])* 2 * S [I])L ++であり; 
       //最初のチームが満たさスロープない場合現在の傾きよりも大きいが、Fをデキューされ、[I] = F [Q [L] +(S [i]を-s [Q [L]])*(S [i]を-s [Q [L])+ M;
       //計算F [i]の一方(L < R && yvalを指定(Q [R-1]、Q [R])* XVAL(Q [R]、I)> = XVAL(Q [R-1]、Q [ R&LT])* yvalを指定は、(Q [R&LT]、I)である)r--の
       尾部がQ [R&LT ++] =デキューされている場合//単調性が満たされていない}のprintf( "%のLLD \ N-"; I 、 F [N-]);}戻り0 ;}

おすすめ

転載: www.cnblogs.com/syzf2222/p/12386788.html