ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ABC103

ついに…!

A - Task Scheduling Problem

提出コード
いきなり難しくてかなり焦りました。愚直に3通りつくって最小をとりました。
全然気づきませんでしたが、最大から最小引くだけですね…
すごい時間かけた気がしたのですが、終わってみると3分台だったのでよかったです。どうやら不備があったらしくリジャッジ等もあったようでした(自分はよく知りませんでした)。

B - String Rotation

提出コード
いろいろ悩んでたら少し時間はかかりましたが、結局愚直に実装することに。とりあえずsの最初の文字を順番に後ろにくっつけていき、先にTと一致したらYes,Sと一致したらNoを出力、という感じで実装しました。 これも悩む時間で結構危ないかなと思いつつ、実装が割とすんなりいったので良かったです。

C - Modulo Summation

提出コード
modを最近よく見かけるなぁと思いました。mを、a_1a_Nの最小公倍数から1引いた数とすると、すべてのa_iに対して、最大の余りであるa_i-1になります。なので、結局はa_1a_Nの合計からNだけ引くと答えになります。
少し自信がなかったのですが、とりあえず出してしまいました。安心しました。


D - Islands War

提出コード
自分の知識量が少ないおかげで、逆に一目見ただけで方針がたちました。
というわけで蟻本で見たことがあった、区間スケジューリングに似た問題です。
(a_i,b_i)の中で、どこか1箇所を撤去すればその条件を満たせます。1つの橋の撤去で多くの条件を1度に満たせるようにしたいです。
そのためには、入れ子になっている部分を探し出し、一番範囲が短いところで撤去すればよさそうです。
b_iについて、昇順でソートします(以降の添え字は、ソート後の添え字とします)。その次に、一番先頭の要素のb_0とその1つ前の島の間の橋(つまり、b_0-1b_0にかかってる橋)を撤去して、その場所をb_nとして記憶しておきます(一番最初の要素は、先ほど言った入れ子の一番深い部分になっています)。
次の深い部分を探します。
ソートした要素を順番に見ていって、

  • 今みている要素ia_iが記憶していた地点b_nより前にあれば、そこは目的の場所ではありません。

  • a_iが記憶していた地点b_nより後になったとき、その区間は次の一番深い部分になっているので、b_iに移動して、橋を1つ撤去します。 この場所を新しいb_nとして記憶します。

これを繰り返して、カウントしていけば答えがもとまります。



というわけで、過去最速の30分台でABC全完できました!(ABConlyなので順位は最高ではなかったです)
ついにレートも水色になりましたー!
f:id:emtubasa:20180722011735p:plain
もうすぐ夏休みなので、そこでまた知識と実装力を増やしていけたらいいですね!