CF1278C-ベリーJam-(接頭辞)

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); 
        } 
    } 

}

おすすめ

転載: www.cnblogs.com/shoulinniao/p/12075697.html