効果の件名:
、あなたが左に食べることができるが食べるために途中からジャム、はしご、の2種類があり、あなたも待ちにジャムほしいですの2種類の最終を作るために右の数を食べることができます
ソリューション:
ことを考えていますが、仕上がりを考慮していませんでした。
ラダーの左側に、我々は1からN 2へラダージャム格納された番号iの右側にある2つの配列で1から番号1とiが数1〜2にジャムI Iを記録し、そして番号。
次にどちらの場合も、
最初の最も右側に最終的な答えは、残りのジャムですされています。私達はちょうど同じ右側1-2 2-1の左側を聞かせする必要があります。
第二の場合は、最終的な答え、すなわち左または右食べ食べ、一方の側に生じます。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefの長い 長いLL。 CONST N = 1E6 + LL 7 。 CONST LL INF = 1E9 + 7 。 [N]をARRちゃいます。 [N] BRR LL。 LL marka1 [N]。 LL marka2 [N]。 LL markb1 [N]。 LL markb2 [N]。 マップ <-1,11,11-> 融点; ボイド解く(){ mp.clear()。 LLのn; cinを >> N; 以下のための(iは= LL 1、I <= N; I ++)CIN >> ARRを[I]。 以下のための(iは= LL 1、I <= N; I ++)CIN >>BRR [i]は、 以下のために(LL iは= 1 ; iが<= N; I ++ ){ 場合(ARR [I] == 1 ){ marka1 [I] = marka1 [I- 1 ] + 1 。 marka2 [I] = marka2 [I- 1 ]。 } 他{ marka1 [I] = marka1 [I- 1 ]。 marka2 [I] = marka2 [I- 1 ] + 1 。 } } markb1 [N + 1 ] = 0 ; markb2 [N + 1 ] =0 ; 以下のための(iはN = LL; I> = 1 ; i-- ){ 場合(BRR [I] == 1 ){ markb1 [I] = markb1 [I + 1 ] + 1 。 markb2 [I] = markb2 [I + 1 ]。 } 他{ markb1 [I] = markb1 [I + 1 ]。 markb2 [I] = markb2 [I + 1 ] + 1 。 } } のための(; I> = iがN =ちゃう1 ; i-- ){ LL K - = marka1 [I]marka2 [i]は、 もし(MP [K] == 0 ){ MP [K] = I。 } } LL ANS = INF。 以下のための(iは= LL 1、I <= N; iは++ ){ kはちゃう = markb2 [I] - markb1を[I]。 もし(MP [K] =!0 ){ ANS =分(ANS、N-MP [K] + I- 1 ); } } LL ANS2 = 0 。 以下のために(INT iが= 1 ; I <= N; I ++ ){ 場合(marka1 [I] == marka2 [i])とANS2 = I。 } ANS2 = N-ANS2 + N。 LL ANS3 = N + 1 。 用(INT ; I> = I = N 1 ; i-- ){ 場合(markb1 [I] == markb2 [i])とANS3 = iは、 } ANS3 = N + ans3- 1 。 COUT <<分(ANS3、分(ANS、ANS2))<< ENDL。 } int型のmain(){ IOS :: sync_with_stdio(0 )。 LL T; cinを >> トン。 一方、(t-- ))(解きます。 リターン 0 ; }