(事業部の定格。2)教育Codeforcesラウンド81 F(セグメント木)

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が      ビルド(11、N- 1。 63である      ANS =分(A [ 1 ]、A [N-]); // 左にA [1] [n]は、右のセットのためのブランク空である
64      のためにINT I = 1。 ; I <N-; I ++){ // 。列挙は、セットサイズを左に、セットのサイズ、要素のコレクションはまた、I〜として指定される1 
65          変更(11、N- 11、POS [I] - 1。 ;、[POS [I]]) // 考慮I、左側の和の位置[i]は、それぞれ、それがモバイルコレクションの左組(元の和に右からプラス要素Iに現れる要素の発生の位置を見つけるために[I-1 - 1] I-1の要素は右に移動された位置1に元々ある、Iの要素1のコストと共に、この時間は、右から左に移動する)
66          変更(11、N- 1、POS [I]、N-、-a [POS [I]); //SUM [i]は、それが私は、モバイルセットの左組から右へのコストを差し引く要素の位置の右側に表示されるで(私の要素を移動させることなく、しかし、以前和の移動コストに追加された[I〜n]のレーン)
67          ANS =分(ANS、ツリー[ 1。 .minn]); // 左組どうかを犠牲にして最小サイズが更新される最小
68      }
 69      COUT << ANS;
 70      リターン 0 ;
 71です }

 

おすすめ

転載: www.cnblogs.com/ldudxy/p/12244494.html
おすすめ