8地方の選挙シミュレーション

A.シーケンス

ディスカバリーは、メッセージの後に維持することが困難です。

だから、直接ブロックのメンテナンスを考えます。

各ブロックのためのベクターは、MAXを介して順次撮影された全ての要素のベクトルのすべての要素を表すブロックを開きます。

maxは自然としたとき、このベクトルの要素は、単調に増加する部分を保持する必要があります。

クエリと暴力がブロックの一部を再構築するとき、彼らは直接要素が何度も更新されて半分にベクトルを決定することができます。

メモリカードため、すべてのブロックごとに5000の提示復興暴力そう。

手に尋ねたところ安いは、UpperBound泣いて、下界としてラベル。

1の#include <ビット/ STDC ++ H>
 2  の#define長い長llの
 3  使用して 名前空間STDを、
4  CONST  INT N = 1E5 + 7 5  INT N、M、SQ。
6 [N] LL、追加[ 700 ]。
7  int型 SZ [N]、BL [N]、ティム[ 700 ]。
8ベクトル<LL> VEの[ 700 ]。
9インラインボイドリビルド(int型K){
 10      であれば(!ティム[K] && [K] .empty()VE)リターン; 
11      INT L =(K- 1)* SQ + 1、R =分(N、K * SQ)。
12      のためには、intは iはLを=; I <= R; ++ i)が{
 13          SZ [I] + = [k]をVEの.END() - UPPER_BOUND()(.begin [k]をVEの、[k]をまし。終了()、[I])+ ティム[K]。
14          であれば、[I] = MAX([I]、[k]をVEの.back())+(VEの[K] .empty()!)追加[K]。
15           A [I] + = 追加[K]。
16      }
 17      ティム[K] = 0 ; [K] =追加0 .clear([K])まし。
18  }
 19インラインボイド変更(int型 L、INT R、INT C){
 20     もし(!c)のリターン;
21      リビルド(BL [L])。(BL [R])を再構築します。
22      のためにINT iは= L、LIM =分(BL [L] * SQ、R); I <= LIM; ++ I)++ SZ [i]は、[I] + = C。
23      であれば(BL [L] = BL [R]!)のためにINT I =(BL [R] - 1)* SQ + 1 ; I <= R; ++ I)++ SZ [I]、[I ] + = C。
24      のためにINT I = BL [L] + 1 ; I <BL [R]; ++ i)は、[I] + = Cを追加++ ティム[I]。
25  }
 26インラインボイド挿入(int型 L、INT R、INT C){
27      リビルド(BL [L])。(BL [R])を再構築します。
28      のためにINT iは= L、LIM =分(BL [L] * SQ、R); I <= LIM; ++ I)の場合(C> [i])と[I] = C ++ SZ [私];
29      であれば(BL [L] = BL [R]!)のためにINT I =(BL [R] - 1)* SQ + 1 ; I <= R; ++ I)の場合(C> [i])とA [I] = C、++ SZ [I]。
30      のためにINT I = BL [L] + 1 ; iが<BL [R]; ++ I)であれば(VEの[I] .empty()|| C-ADD [I]は、>([I] .backまし))[I] .push_back(C-VEの追加[I])。
31  }
 32インラインボイドクエリ(INTX){
 33      のint、K = BL [X]。
34      場合のprintf(([k]をVEの.empty()!)" %のLLD "、MAX([X]、.back [k]をVEの())+ [k]を追加)。
35      のprintf(" %のLLD "、[X] + 追加[K])。
36      のprintf(" %dの\ n "、SZ [X] + [K]をVEの.END() - UPPER_BOUND().begin([k]をVEのは、+).END()、[X] [k]をVEのティム[K])。
37  }
 38インラインint型リード(登録整数 X = 0、レジスタチャー CH = GETCHARを()、レジスタINT F = 0){
 39      のために(!; isdigit(CH)、CH = GETCHAR())は、f = CH == ' - ' 40      のために(; isdigit(CH)、CH = GETCHAR())X =(X << 1)+(X << 3)+(CH ^ 48 )。
41      リターン F - ?X:X;
42  }
 43  、INT (){主
 44      N =(読み取り)SQ = SQRT(N)* 0.5 + 1 45      のためにINT iが= 1 ; iが<= N; ++ I)[I] = read()は、BL [I] =(I- 1)/ SQ + 1 46      、M = ()を読み出します。
47      のためにINTは iは= 1 ; I <= M ++、L、R、Cを{I)
 48          チャー CH = GETCHAR()。しばらく(!はisalpha(CH))CH = getchar関数();
49          もし(CH == ' A ')は、L =(読み取り)、R =(読み取り)、= C (L、R、C)を変更し、read()は。
50          他の 場合(CH == ' M ')L =(読み取り)、R = read()は、C = ()インサート(L、R、C)を読み取ります。
51          他のクエリ(読み());
52          であれば((I&!4095))のためのINT J = 1 ; J <= BL [N]; ++J)(j)を再構築します。
53      }
 54      リターン 0 55 }
ブロック

暴力ボトルネック修正の時間複雑さを再構築する、複雑さは$ O(N \ SQRT {nlogn})$です。

再構成は、各ブロック内の要素の順序を維持し、単調ポインタで見つけることができ、操作がマージ、全体的な複雑さ$ O(N \ SQRT N)$のために修飾することができます。

正のソリューションは、オフライン走査線操作のために練習します。

各操作は、削除するために、左の点、右のポイントに参加するように考慮されます。

容易に操作$ A_1 \ M_1 \ A_2 \ M_2 \ A_3 \ M_3 $形式のシーケンスに変換次いで、その加算演算が一緒に隣接見出すことができます。

対価は、オリジナルのテイク最大の正当な操作を維持$ S_I $接頭辞$ a_iを$表明設定しています。

最大動作は、$ M_ {I-1} + S_I-S_ {I-1} <M_I $場合にのみ確立されとることができます。

転置利用できる$ M_ {I-1} -s_ {I-1} <M_I-S_ {I} $、であれば上に形成されたメンテナンス$ M_I-S_I $単調に増加する構造として。

このことは、単調なスタック・セグメント・ツリーを維持するためのアイデアを維持することができます。

 

B.の旅行計画

サブセクションはシンプルですが、正の解決策を考えるのは難しいです。

正のソリューションは、おそらく取る$ D $は$ K $とリンク内のすべてのブロックの右側をGCDています。

明白な答えはわずか$ D $の倍数とすることができ、それがエッジに、すべての権利であるかもしれないし、すべての$ K $ $ $ Dを取り除きます。

そのような場合があり、その下型ブロック有意和$ K $ $ $ 1内のリンクの重みのすべての側面。

しかし、唯一つの回路は、単にリンクブロック後の時間の任意の偶数のいずれかの側(工法は、ツリーの非回転側であってもよい遭遇DFSツリーウォークにおける問題に対する解決策を与えている)ように、構成することができます。

だから、$ 2 $ループ$ C $の下型$ k個の$の有意な貢献で構築が可能です。

$ K $が奇数の場合、我々は最終的な答えは、$ 0 $であるように、$ uは、このパスを$ RIGHTARROWのu \ RIGHTARROW Vを\取るために続けることができます。

私たちも、$ K $を考えるだけです。

今のV $の間の経路内の偶数(すなわち、下型2 $ $ $ $意味0)の長さがあるかどうかを\ $ Uを考えます。

それは、すでに回路$ C $を持っているので、パスの長さは偶数であるがあれば、答えは確かに$ 0 $です。

そうでなければ、答えはたったの$ 1 $することができます。

したがって、各パリティの各ブロックユニコム染色(規格が隣接プない場合もちろん染色)のためには、二部グラフ、それかどうかが決定されます。

しかし、問題は各$ K $与えられたが異なることであるがあり、その前処理をする方法はありません。

しかし、偶数はまだ素因数$ kの元$ 2 $ユニコムGCD $ 2 $ブロックより$ $ $の数はもっとあることを言うことですつまり、$ $ $ Dを後に超える$ kに加えて、ここで注目されます。

ユニコム二つの異なる$ $ GCD後のパリティの右側にある元のブロックが同じなので、直接添加が可能前処理であるので。

 

C.ハック

各パスを保証することができます見つけることができます直接最小カットをカットする必要がありますが、一度だけカットを保証することはできません。

ハンドカットのプレイ状況は、複数回、$ S $ / $ T $セット、満たし$ T $ $メモリー背面側S $セットのセット、その後、死亡したそれぞれ形成されたソースシンクに相当しました。

問題の練習溶液は$裏面INF $、各エッジの右側の確立は、上記ケースに上記の正当切断されないので、パスを増強があるであろうことを考えます。

したがって、最小カットは、直接その上で実行されます。

おすすめ

転載: www.cnblogs.com/skyh/p/12204056.html