1の大きさに予めセット左〜すべての要素が適切なセットのコストに移動されたときにI-1 [i]の和として表されます。
列挙サイズは、左ヘッダ、I左/左組の要素の更新されたコストの最終状態は移動します。
フェンウィックツリー/ツリーライン間隔変更/範囲クエリを処理します
1 の#define HAVE_STRUCT_TIMESPEC 2の#include <ビット/ STDC ++ H> 3 使用して 名前空間STDを、 4 の#define LL長い長い 5 のconst int型 N = 2E5 + 7 。 6 構造体ツリー{ 7 LLミネソタ州、怠惰。 8 }ツリー[N << 2 ]。 9 LL和[N]。// 前缀和 10インラインボイドビルド(int型の根、INT L、INT R){ 11 であれば(L == R){ 12 ツリー[ルート] .minn =和[L]。// 1〜L的[I]之和 13 ツリー[ルート] .lazy = 0 。 14 リターン; 15 } 16 int型ミッド=(L + R)>> 1 。 17 ビルド((ルート<< 1 )、L、MID)。 18 ビルド((ルート<< 1 | 1)、ミッド+ 1 、R); 19 ツリー[ルート] .minn =分(ツリー[(ルート<< 1)]ミネソタ州、ツリー[(ルート<<。1 | 1)]ミネソタ州)。// 最大 20 リターン。 21 } 22インライン無効プッシュダウン(int型のルート){ 23 もし(!ツリー[ルート] .lazy) 24 リターン。 25 ツリー[(ルート<< 1)]ミネソタ+ = ツリー[ルート] .lazy。 26 ツリー[(ルート<< 1 | 1)]ミネソタ+ = ツリー[ルート] .lazy。 27 ツリー[(ルート<< 1)]怠惰+ = ツリー[ルート] .lazy。 28 ツリー[(ルート<< 1 | 1)]怠惰+ = ツリー[ルート] .lazy。 29 ツリー[ルート] .lazy = 0 。 30 リターン; 31 } 32インラインボイド変化(int型の根、INT L、INT R、int型のx、int型 Y、INT ヴァル){ 33 であれば(R <X || L> Y) 34 リターン。 35 であれば(X <= L && R <= Y){ 36 ツリー[ルート] .minn + = ヴァル。 37 ツリー[ルート] .lazy + = ヴァル。 38 リターン; 39 } 40 int型ミッド=(L + R)>> 1 。 41 プッシュダウン(ルート)。 42 変化((ルート<< 1 )、L、中、X、Y、ヴァル)。 43 変化((ルート<< 1 | 1)、中間+ 1 、R、X、Y、ヴァル)。 44 ツリー[ルート] .minn =分(ツリー[(ルート<< 1)]ミネソタ州、ツリー[(ルート<<。1 | 1)]ミネソタ州)。// 最大 45 リターン。 46 } 47 INT N、P [N]、[N]、POS [N]。 48の LL ANS; 49 INT メイン(){ 50の IOS :: sync_with_stdio(偽)。 51 cin.tie(NULL)。 52 cout.tie(NULL); 53である CIN >> N-; 54である ため(INT I = 1 ; I <= N; ++ I)は{ 55 CIN >> P [I]、 56は POS [P [I] = I ; // デジタルPの位置[I]はIに表示された 57である } 58 のために(INT I = 1 ; I <= N; ++ I){ 59 CIN >> [I]; 60 SUM [I] = SUM [ I- 1 ] + [I]; // SUM [I]私は、すべての要素のセットがとる右コレクションに移動するように残されるコレクションサイズの左側に 61である } 62が ビルド(1、1、N- 1。 ) 63である ANS =分(A [ 1 ]、A [N-]); // 左にA [1] [n]は、右のセットのためのブランク空である 64 のために(INT I = 1。 ; I <N-; I ++){ // 。列挙は、セットサイズを左に、セットのサイズ、要素のコレクションはまた、I〜として指定される1 65 変更(1、1、N- 1、1、POS [I] - 1。 ;、[POS [I]]) // 考慮I、左側の和の位置[i]は、それぞれ、それがモバイルコレクションの左組(元の和に右からプラス要素Iに現れる要素の発生の位置を見つけるために[I-1 - 1] I-1の要素は右に移動された位置1に元々ある、Iの要素1のコストと共に、この時間は、右から左に移動する) 66 変更(1、1、N- 1、POS [I]、N-、-a [POS [I]); //SUM [i]は、それが私は、モバイルセットの左組から右へのコストを差し引く要素の位置の右側に表示されるで(私の要素を移動させることなく、しかし、以前和の移動コストに追加された[I〜n]のレーン) 67 ANS =分(ANS、ツリー[ 1。 .minn]); // 左組どうかを犠牲にして最小サイズが更新される最小 68 } 69 COUT << ANS; 70 リターン 0 ; 71です }