AtCoder Beginner Contest 174 参加記
ABC174に参加して、47分で全完して221位だった。うれしい
ABCで全完したのはこれが初めてです。
A,B,Cまで普通のでD問題がちょっと難しくてE問題がかなり難しくてF問題がtwitterで見たことあるやつだった。
A~Eまでのそれぞれの問題に対して考察を書く。
A. Air Conditionar
Xを受け取って30と比較する 三項演算子で、はい
C++:
https://atcoder.jp/contests/abc174/submissions/15587969
https://atcoder.jp/contests/abc174/submissions/15631507
B. Distance
これも問題文の通りにやる。を関数にわけると、うれしい
C++:
https://atcoder.jp/contests/abc174/submissions/15594907
https://atcoder.jp/contests/abc174/submissions/15634182
C. Repsept
これはちょっと難しい。
数列A=7,77,777,7777,.....として、これをKで割った余りで置き換えた数列AmodKを考える。K=101の場合AmodK=7,77,70,0,7,77,70,0,....となる。ここでAmodK[i]==0となるiを求めればよい。
7,77,777,7777,.......という数を愚直に持ってmodK(Kで割った余り)を計算していくと77777777777777777777777とか、桁数が大きくなるとオーバーフローしてしまうのでうれしくない。
少し考えると、A[i] = A[i-1]*10+7になっているのがわかる。これでAを陽に持つ必要がなくなった。次に、modKでは足し算とか掛け算は適当にやってもいいので毎回Kで割りながら計算していけばよさそうな気になる。
この方法だとAにKの倍数が存在しないときに無限に計算を続けてしまい厳しい気持ちになるが、適当に1e7回ループして無理なら無理。ということにしたらACを得たので、ヨシ!w
C++:
https://atcoder.jp/contests/abc174/submissions/15745382
https://atcoder.jp/contests/abc174/submissions/15635522
D. Alter Alter
うーん 木びしい
これは最終的にRRR....RRRWWW...WWWという形になってほしいので、そういうことを考えると、右側にあるRはWに色を塗り替えるか左側にあるWとswapする。
えー、なんとなくRとWの前から、後ろから累積和をとってごちゃごちゃする気分になる。
sample3で考えると
W | R | W | W | R | W | R | R | ||
front R | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 3 | 4 |
front W | 0 | 1 | 1 | 2 | 3 | 3 | 4 | 4 | 4 |
back R | 4 | 4 | 3 | 3 | 3 | 2 | 2 | 1 | 0 |
back W | 4 | 3 | 3 | 2 | 1 | 1 | 0 | 0 |
0 |
こんな感じになる。これを見ると、みると、みてもよくわからない。
まあ考えると、i番目までみて、それより左にあるWを消す。それより右にあるRを消す。としたい。min(frontW[i],backR[i])個はswapして残ったのは色を変える作戦でi=0~nまで計算してそれのminをとるとサンプルが合うので、提出するとAC
C++:
https://atcoder.jp/contests/abc174/submissions/15611373
https://atcoder.jp/contests/abc174/submissions/15641506
E. Logs
かなり難しくて、難しい。
一瞬、全部priority_queueに入れて、大きい順に取り出して半分にして戻す。という操作をK回やればよさそうな気になるがKが1e9なので時間的に不可能だし、Kが小さくてもsample1でそれをするとダメなことがわかる。コンテスト中はここまで考えてわかんねーとなってF問題を見に行った。Fが見たことあるやつなのでACができて、帰ってくると、二分探索という言葉が降ってくるので、それで考える。つまり、長さの最大値の最小をLen以下にできるかという判定問題を解ければそのLenの取りうる値を二分探索できるので、おーけー笑
ここまで考えれば8割ACしたようなもんだが、ぼくは算数が苦手なので、ここから詰めるのにかなり苦戦して、長さA[i]の丸太を何回か切って最大の長さをもつものがLen以下になるようにしたいという問題をO(1)で解くのにかなり苦労した。競プロ経験からこんなんA[i]/Lenのceilかfloorだろwwwと思ってやったらどっちもsampleがあわず、あーーーーーあーあーあーあーあー^^^^^^^^^^ーあーあーあーあー^ーあ^ーあ^あー^ーああ^ー^という気分になった。ceil(A[i]/Len)-1にしたら通ったので、おーん.....
なんでceil(A[i]/Len)-1かというと、ceil(A[i]/Len)で、切った後できる丸太の数を表していて、それ-1が切った回数になる。自明ですね。今なら3秒で思いつくけどコンテスト中は3分か5分かしらんけどめちゃくちゃ時間がかかったので、反省。
C++:
https://atcoder.jp/contests/abc174/submissions/15622885
Ptyhon:
https://atcoder.jp/contests/abc174/submissions/15643056
F. Range Set Query
区間の種類数を答える。問題を見た瞬間、これtwitterでやったことある!と思って"区間 種類 競プロ"でググると、これが一番上に出てくる。
hama-du-competitive.hatenablog.com
これの解放2をやる。ソースコードがnot foundになっているので、書いてある通りに実装して、got AC
C++:
https://atcoder.jp/contests/abc174/submissions/15617683
感想というか考察過程を書こうと思って書いたらクソめんどくさくてもう一生やらねーーーーーーーーとなった
数学の表現を使いて絵(はてなブログの見たまま編集をつかっています)