https://vjudge.net/problem/CodeForces-1278C
問題の意味:2Nボトル詰まりがあり、階段数は、ボトルの最小数は空に、ジャムの二種類に等しくなるように、中間の空のジャムの中央、左または右の辺によって分離しました
アイデア:-1これらの言葉のこぎりと全く分からない最初の、および接頭辞を使用したいのですが、ブログの記事を参照して、ジャムの数を使用する方法がわからない、数2、なぜ理解していました。
データの最初のセット、例えば
元のデータ1,1,1,2,2-、1,2,1,2,1,1,2
となり1,1,1、-1、-1,1、-1,1、-1,1,1、-1
プレフィックスと1、2,3,2、1、2、0,1,0,1,0、-1
クリアジャムだけ階段の途中から両側に延びており、プレフィックスが右に→累積接頭辞を残しているとも←累積とバー接尾辞として知られているそうです。正および負のは、それぞれ、いくつかの余分な数を妨害和に等しい示す数に等しいです。赤いフォント位置、6本の合計をクリアするために、両方の必要性の間でジャムとして。できるだけ少し、同じ接頭辞と接尾辞、接頭辞としてジャムの数をクリアして、可能な限りひいては、左に右に可能な限り右に左にするために。
そして、もしデータの別のセット
元のデータ1,0,0、1,0,0
1となり、-1、-1、1、-1、-1
接頭辞および 1、0、-1、 -1、-2、-1
明らかに左の2本を取り外し答えです。
援助入札アレイおよびアレイと赤の選択位置は、2つの配列が演じる上付き文字を表す役割を。
詳細を見るためにデータコードの第三のセットに対応する方法。
第四のアレイ1,2、1,1または1,1、2,1と同様に、取引0にする必要があります。WA、このデータに何回も。コードの詳細な表情。
インポートjava.util.Arrays; インポートjava.util.Scanner; パブリック クラスメイン{ 公共 静的 ボイドメイン(文字列[]引数){ スキャナスキャン = 新しい新しいスキャナ(System.in); int型N-、X; INT T = スキャン。 nextInt(); 一方、(T!= 0 ){ int型 P = 100000 ; INTは、 [] = 新しい新しい INT [100005]を; // 左及びジャムプレフィックス→ INT [] B = 新しい新しい INT [100005]; // 右ジャムサフィックスと← int型[] = AID 新しい新しい INT [200005 ]; INT []入札= 新しい新しい INT [200005 ]; // 接頭辞と添え字、補助[2] = 5つの意味アレイプレフィックスで標準コンテンツ・アレイのための接頭辞2及び5位 T-- ; N- = scan.nextInt(); AID [P] = 0 ; のための(INT I = 1; I <= N; I ++){ // 右入力、及び直接計算プレフィックスに委ね = X scan.nextInt(); IF(X == 1 ) A [I] = A [I-1] +1し、 他 [I] = A [I-1] -1 ; INT IDX = A [I] + P; // 配列の境界の負リード経験防止 AIDを[IDX] = I; // 接頭辞と遠できるだけ右に、私増加 } ため(INT {。;私は<= N-I ++ I = 1)// 左から右への入力 X = scan.nextInt(); IF(X = 1。! ) X = -1 ; B [I ] = X; } 入札[P] = N + 1 ; のための(INT I = N-; I> = 1; i--){ // 右から左へと計算サフィックス B [I] + B = [I + 1 ]; INT IDX = B [I] + P; 入札[IDX] = I; // サフィックスによってできるだけ左、I小さい } INT ANS = 2 * N-; // 離れるまでのすべてのジャムは、データの第三の群に対処する ために(INT I = -n; I <= N; I ++ ){ IF((AID [P + I] = 0 &&入札[PI]! = 0)||(I == 0 )) ANS = Math.min(ANS、N - AID [P + I] +入札[PI] -1 ); } のSystem.out.println(ANS); } } }