リンク:https://codeforces.com/contest/1173/problem/C
質問の意味:
Nauuoはトランプが大好きな女の子です。
ある日、彼女はトランプが、カードは、いくつかの空のものと混合していることがわかりました。
あり nは n個から番号のカード 1へ1 のn nであり、彼らは別と混合した n個のn空のカード。彼女が積もっ 2枚のn 2nのカードをして描いた n個のnそれらの。 nは Nauuoの手の中にn個のカードが与えられています。残り のn Nパイルのカードはまた、上から下への順序で与えられます。
一度の操作では、彼女は彼女の手でカードを選択し、それを再生することができます - 山の一番下にそれを置く、その後、山から一番上のカードを引きます。
Nauuoを欲しがっている n個のn番のカードを(増やすために積み上げ I上から下まで杭のi番目のカードがカードである 、私は可能な限り迅速にI)。あなたは彼女に操作の最小数を伝えることはできますか?
アイデア:
直接仕上げを考慮することはできません。
この後0いくつかを検討し、n個のカードと一緒に遊びます。
それは、I-1を得ることができる位置にあるときにのみ、第二の位置PIで、次いで、i番目のカードアレイを仮定する。Nは、完成見に出てき。
得られたRES = MAX(RES、PI-I + 1 + N)。
コード:
#include <ビット/ STDC ++ H> 名前空間STDを使用して、 typedefの長い長いLL。 const int型MAXN = 2E5 + 10。 const int型MOD = 1E9 + 7。 N INT、M、K、T。 マップ<int型、int型>では、 [MAXN] int型。 INTメイン() { // freopenは( "test.in"、 "R"、STDIN)。 cinを>> N; 以下のために(INT i = 1; iが= <N; iは++) CIN >> [I]において、[I] = 0; 以下のために(INT i = 1; iが= <N; iは++) CIN >> [I]において、[I] = I。 ([1]において)場合 、{ I = 2 int型。 (; IN [I] ==では[I-1] +1; iが++)のために、 (N == [I-1]で)なら 、{ int型J。 J <;(J = iについて IF(J> N) COUT << N-I + 1 << ENDL。 0を返します。 } } } int型RES = 0。 以下のために(INT i = 1; iが<= N; iは++) RES = MAX(RES、IN [I] -i + 1 + N)。 coutの<< RES <<てendl; 0を返します。 }