ABC200

結果

A  \ : 02:42

B  \ : 05:50

C  \ : 55:27

ノーペナ 3完で,パフォは 503,rating変動は -23 762 \to 739でした.

考察

A問題

基本的には( 100で割った商) +1を出力すればOK.

ただし, 100の倍数の年だけ例外で,この時は 100で割った商をそのまま出力する.

B問題

やるだけといえばやるだけ.

 200で割り切れるなら 200で割って更新します.

 200で割り切れないなら, 1000倍して 200を足します.文字列の連結とか難しいことは考えずに計算でできます.

C問題

差が 200の倍数になるペアは,ともに 200で割った余りが等しいことに着目します.

例えば 723, 123, 923, 523であれば, 200で割った余りは全て 123です.

 A[ \ ]に出てくる数字を 200で割った余りで分類し,それぞれの余りに対して問題のような選び方が何通りあるかを計算します.

上の例で言えば, 723のペアは 123, 923, 523 123のペアは 923, 523,923のペアは 523です.

つまり,ある余りになるような A[ \ ]がnum個あるとすると,問題を満たすようなペアの数は

 ({\rm num}-1) + ({\rm num}-2) + \cdots + 1 = \dfrac{({\rm num}-1) \times {\rm num}}{2}

です.

感想

C問題で沼りました.累積和かな?って1回思ったらそこから抜け出せなかったですね...

1ヶ月半振りのABCでした.

久しぶりのコンテストで激冷えを覚悟していましたがこの程度でよかった()

少しずつ感覚を取り戻していきます.

XOR World

ABC121-D "XOR World"

提出コード

atcoder.jp

考察

着目したのは以下の性質です.

任意の偶数 nに対して, n \oplus (n+1) = 1

大雑把な証明をしておきます.

任意の偶数 nに対して, nの最下位ビットは 0です.

一方で n+1を考えると,最下位ビットが 1で,その他のビットは nと等しいです.

よって, n n+1のXORをとると 1になることがわかります.


上の性質を用いると, Aから Bの中に偶数から奇数に切り替わるタイミングが何回あるか(numとおきます)を考えることで計算量を大幅に小さくできます.

また,num回の 1のXORについて,numが奇数であれば 1になり,numが偶数であれば 0になります.


私は Aが偶数か奇数か, Bが偶数か奇数かの 4通りの場合分けをしました.

(i)  Aが奇数で, Bが奇数

 A+1から Bまでが繰り返し部分で,num =\frac{B-A}{2}です.

つまり,num回だけ 1をXORした後,余った AをXORすればOK.

(ii)  Aが奇数で, Bが偶数

 A+1から B-1までが繰り返し部分で,num =\frac{B-A-1}{2}です.

つまり,num回だけ 1をXORした後,余った A BをXORすればOK.

(iii)  Aが偶数で, Bが奇数

 Aから Bまでが繰り返し部分で,num =\frac{B-A+1}{2}です.

つまり,num回だけ 1をXORするだけでいいです.

(iv)  Aが偶数で, Bが偶数

 Aから B-1までが繰り返し部分で,num =\frac{B-A+1}{2}です.

つまり,num回だけ 1をXORした後,余った BをXORすればOK.

以上により, O(1)で解けました.

感想

久しぶりの精進ツイートです.新生活でバタバタしていました.

この問題のdiffは 1164ですが,今この問題が出たら 800ぐらいな気がしますね.

模範解答がきれいすぎて感動しました笑

ABC196

結果

A  \ 01:51

B  \ 03:23

ノーペナ 2完で,パフォは 344,rating変動は -39 801 \to 762でした.

考察

A問題

 b-cを出力すればOK.

ただ,自分はコンテスト中はそれで本当にいいのか一瞬で判断できませんでした.

符号の問題があったりでそこを考察するよりは全探索をすることを優先しました.

よって, a \leq x \leq b c \leq y \leq dを全探索し, x-yの最大値を随時更新していくことでAC.

B問題

入力は非常にでかい可能性があるので,まずはstrigで受け取ります.

先頭から順番に出力していき,途中で ' . ' を読んだら終了します.(もちろん ' . ' は出力しない)

途中に ' . ' がなければ最後まで出力し続ければOK.

感想

最近では群を抜いてパフォが低かったです.

C問題なんで思いつかなかったんだろう...?

ちなみに,ABC194と195も参加していましたが記事を書くのが面倒で更新していませんでした()

Coloring Dominoes

ARC081-D "Coloring Dominoes"

提出コード

atcoder.jp

考察

以下, 2 \times 1のドミノを縦ドミノ, 1 \times 2 のドミノを横ドミノと呼びます.

問題の性質より,ドミノの並べ方は,縦ドミノそのもの( 以下 D_{ver} ),または横ドミノを縦に並べたもの( 以下 D_{hor} )のいずれかを横に並べていくことになります.

(ちなみに,vertical:垂直,horizontal:水平から名前を付けました)

ドミノの色の塗り方は,基準となるドミノが D_{ver}  D_{hor} か,そしてその左隣が D_{ver}  D_{hor} か,で4通りあります.

以下の場合分けでは,例えばあるドミノが D_{hor}で,左隣が D_{ver} のとき, D_{ver} \to D_{hor}のように書くとします.

(i)  D_{ver} \to D_{ver} のとき

 D_{ver} が連続しているので,色の塗り方は2通りです.

(左隣の D_{ver} の色以外を選ぶ2通りになります.)

(ii)  D_{ver} \to D_{hor} のとき

 D_{ver} に対して, D_{hor} の色の塗り方は2通りです.

(左隣の D_{ver}の色以外の2色のうち,どちらを上に塗るかで2!=2通りになります.)

(iii)  D_{hor} \to D_{ver} のとき

 D_{hor} に対して, D_{ver} の塗り方は1通りです.

(既に左隣で2色使ってしまっているためです.)

(iv)  D_{hor} \to D_{hor} のとき

 D_{hor} に対して, D_{hor} の塗り方は3通りです.

(これは説明がめんどいので省略...)


また, 0 \leq i \lt Nに対して S[ i ] = T[ i ] であれば i番目は D_{ver} で,そうでなければ i番目から i+1番目にかけてが D_{hor}であることがわかります.

1つ前のドミノが D_{ver}  D_{hor} かどちらかを持っておき,上の場合分けの数字をかけ算しながらmod  10^{9}+7をとっていくことで O(N) で解けます.

感想

久しぶりにこれぐらいのdiff(これは1165)の問題をやりました.

記事の更新も久しぶり.

そこまで難しくないという気持ちがあって,最近のdiffに換算したら700ぐらいな気がします.

一発ACできてよかった.

CADDYコン(ABC193)

結果

A  \ 02:00

B  \  09:14

C  \ 33:49

D  \ 78:33

 1WAの 4完で,パフォは 1057,rating変動は +28 801 \to 829でした.

B問題で 1WAしたってマジ...?

考察

A問題

 100 - 100 \times \dfrac{B}{A}

を出力すればOKです.

算数できなさすぎて割合計算で 2分もかかりましたw

B問題

最終的な出力をする変数をansとして,始めはデカい数字を入れておきます.(私はlong longで変数をいつも宣言しているので 10^{18} で初期化しました.)

 0.5分刻みでスヌケマシンは売れてゆくので, 0 \leq i \lt N i について, A [ i ] \lt X [ i ] であればスヌケマシンは売れ残っていると見なせます.

このとき,現在の最小料金ansよりも P [ i ] が小さければansを P [ i ] で更新します.


なぜかめちゃくちゃ問題文の読み間違えをしていました.

始めは,残っているスヌケマシンを一番多く買ったときの料金を求めていましたw

C問題

 a^{b}の形の数はとても少ない気がするので,片っ端から列挙します.

 aの調べる範囲ですが, b=2が最小であることを考えれば 2 \leq a \leq \sqrt{N} です.

このようなそれぞれの aについて, Nを超えるまで 2乗, 3乗,...としてmapやsetなどのデータ構造に突っ込んでいきます.

普通に数えていくと, 2^{4} 4^{2}のように重複カウントがあるのでmapなどで管理しないといけません.

D問題

これは超絶ゴリ押しました.

 1から 9のカードがそれぞれ何枚残っているかを持っておきます.

何枚残っているかをsumとでもおくと,高橋くんと青木くんの裏向きのカードの組み合わせの総数はsum \times ( sum -1)です.

次に,高橋くんの 5枚目と青木くんの 5枚目の数字が何かで全探索します.(最大でもたぶん 9 \times 9通り)

つまり, 1から 9のカードがそれぞれ何枚残っているかを更新しながら場合の数を頑張って計算します.

例えば,高橋くんの裏カードが 5だと仮定して,青木くんの裏カードとして 8が条件を満たすとします.ここで, 8の残りの枚数だけ条件を満たす場合の数があります.

高橋くんが選んだカードの残り枚数を減らしておく必要があること,そしてそのカードを見終わったら残り枚数を元に戻しておく必要があります.

得点の計算方法ですが,気合です.

感想

B問題までで時間がかかったりWAを出したりめちゃくちゃ焦りましたが,Dまで解けてよかった...

コンテスト中に緑diff問題を解けたのでとても嬉しいです.

Darker and Darker

AGC033-A "Darker and Darker"

提出コード

atcoder.jp

考察

イメージとしては,既にある黒いマスから四方にどんどん黒いマスが広がっていくかんじです.

これにはキューを使ったBFSがよさそうです.

まずは,初期段階で黒いマスを全てキューにpushします.

キューの先頭要素に対して4近傍を見て,それが与えられたマスの外でなければキューにpushします.ただし,既に見たマスをキューに入れると同じ処理を永遠に繰り返すことになるので,各マスについて既に訪問したかを持っておく配列を作るといいでしょう.


また,問題文の1回の操作でどこまで黒いマスを広げられるかということが大事です.例えば,マス(2, 3)の右側(2, 4)を黒く塗ったとします.そして(2, 4)の右側(2, 5)も黒く塗ると,これは2回操作をしていることになります.

これを解決するには,各操作の初めにキューの大きさを見ておいて,その回数だけキューの先頭要素を見ていけばOKです.もちろんキューには後ろからどんどん次の探索点が追加されていきますが,操作初めのキューの大きさだけ見ることで,その操作でpushした点を見ることはないです.(次の操作で見ることになります.)


イメージ図は以下です.

f:id:chankilu23:20210217170315j:plain

数字が nのところは, n回目の操作であることを示しています.

目がチカチカしないように, 3までは色をつけておきました.

感想

とてもBFSみを感じる問題でした.

修行の成果が出た気がします.

(ちなみに1回WAしましたw あと凡ミスで1回TLE)

ABC191

結果

A  \ 02:08

B  \ 03:38

ノーペナ 2完で,パフォは 936,rating変動は +12 819 \to 832でした.

考察

A問題

距離では, V \times Tmから V \times Smの間はボールは消えています.

よって, V \times T \leq D \leq V \times S ならば青木君はボールを打てます. 打てません.

それ以外は打てません. 打てます.

B問題

 A[ ]を初めから見ていき, Xでなければ出力していけばOK.

C問題

縁取りをしていましたがうまくいかなかった...

左下のマスから反時計回りに 4近傍を見て,訪問済みでなければ進んでいく.

進む方向を保持しておいて,向きが変わったら答えを +1する.

原因は判明していて,いわゆる一筆書きできないような黒いマスなら詰みます.

感想

早解きに関して言えばB < Aでしたね.Bの方がシンプルな分早くできました.

C問題こんなのアリですか...

まぁ緑から落ちなかったしいいか