AtCoder Beginner Contest 140

jsc2019で久しぶりにキョウプロしました

 

ABを早く解くことができて割と順位はよかったです。

でもC~は手も足も出ず精進不足を感じました。気が向いたときにやっていこうと思います。

 

今回はサボってた時期のコンテストを解きました。

 

 

 

A - Password

やるだけ。ひっかけかと思ったけど大丈夫でした

 

B - Buffet

各料理を1回ずつ食べることに気づけばやるだけです。これもひっかけじゃなくてよかったです

 

C - Maximal Value

逆に求めます。Ai=min(Bi-1,Bi)をやるだけです。端に気を付ければよいです

 

D - Face Produces Unhappiness

問題:N人が東西どちらかを向いて並んでいる。以下の操作をk回行い「前の人が自分と同じ方向を向いている」人を最大化せよ

操作:区間[l,r]の人の順番を入れ替え、向いている方向を逆転する。

 

考察:

LRLRLRと同じ方向を向いている人々をグループ化します

そうしたとき、複数グループを反転させる意味がないことがわかります。

したがって、どこかのグループを反転させることになります。

 

各グループ幸せでない人は1人です。またどのグループを反転させても幸せな人は2人増えます。

したがってn-(グループの数)+2*kが答えとなります

最大でもn-1人までなことに注意しましょう

 

E - Second Sum

問題:順列Pを考える。すべての長さ2以上の連続する部分列について、2番目に大きい数の和を取れ。

 

考察:

典型です。ある数字iについて、これが2番目に大きくなるような区間を考えます。

i<jなるjが下のように位置し、indexをa,b,x,c,dとします

 

j j i j j

a b x c d

こうすればO(1)でiによる寄与がわかります

 

multisetで上からindexを追加していけばO(NlogN)で解くことができます

 

F - Many Slimes

問題:スライムを集合Sに一致させよ

 

考察:上から貪欲でよいです。multisetでO(MlogM)で解けます(M=2^N)