ABC177参加記

AtCoder Beginner Contest 177 に参加して5完163位だった。爆速5完キメて最高に気持ちええ ありがとう 競プロ最高!一番好きなギャンブルです!ww

f:id:knzk398:20200830124459p:plain

 

A. Don't be late

D,T,Sが与えられるD<=T*Sか

B. Substring

Tの始点を全部試して実際に何個一致しないか数える

Python

https://atcoder.jp/contests/abc177/submissions/16397045

C. Sum of product od pairs

\sum_{i=1}^{N-1} \sum_{j=i+1}^{N} a_i * a_jを求める問題。愚直に計算するとO(N^{2})になってTLEしてしまうが、内側の\sum_{j=i+1}^{N}a_i * a_jに注目すると、a_iの値は定数という事がわかるのでa_i * \sum_{j=i+1}^{N} a_jにしてよい。\sum_{j=i+1}^{N} a_jは累積和を使うとO(1)で求まるので、i=1...N-1まで計算すればよい。オーバーフローしないようにMODをとる場所に注意する。

C++

https://atcoder.jp/contests/abc177/submissions/16393159

Python

https://atcoder.jp/contests/abc177/submissions/16397137

D. Friends

見た瞬間にグラフの最大連結成分の大きさが答えということがわかるのでunion findを貼ってsizeのmaxを出力します。直感的にそうなので、論理的に説明するのは難しいです。ふつうにbfs/dfsをしてもいいと思います。

C++

https://atcoder.jp/contests/abc177/submissions/16393388

Python

https://atcoder.jp/contests/abc177/submissions/16397426

E. Coprime

N要素の配列Aは対ごとに素ですか、互いに素ですか、どちらでもないですか?という問題。gcd(a,b)=1であることをaとbは互いに素であるといい、gcd(a,b,c)=1とか、数が2つ以上になってもそのすべてのgcdが1であるなら互いに素と言います。「互いに素」というと2つの間の関係しか指さないような気がして直感的ではない気がしますね。

対ごとに素というのは問題文の\forall(i,j), gcd(a_i,a_j)=1という意味です。(ところでこの書き方は正しいですか?わかりません 誰か教えてください)

全てのa_i素因数分解したときに、ある素数pが2つ以上の数に含まれていたらAは対ごとに素ではありません。全てのa_iを愚直に素因数分解して確かめるとO(N\sqrt A_{max})で解くことが出来ますが、この問題はN=A_{max}=10^{6}なのでN\sqrt A_{max} = 10^{6} * \sqrt 10^{6} = 10^{9}となり、TLEしてしまう可能性が高いです。(僕は競プロ初心者なので時間計算量解析をしずにコンテスト中にこれを書いて1916msで通ってしまいました。ごめん....)

普通に素因数分解をするとO(\sqrt A)かかってしまいますがAtCoderの解説に書いてあるエラトステネスの篩でごちゃごちゃすると、前計算O(AloglogA)素因数分解O(\log A)でできるようになり、AC!

 C++

https://atcoder.jp/contests/abc177/submissions/16396763

Python

https://atcoder.jp/contests/abc177/submissions/16394973

 

F. I hate shortest path problem

解けません おわり

最初一番左上からスタートと誤読していて(実際は一番上の任意の場所からスタートできる)めちゃくちゃ適当な解を投げてしまっていた。

区間加算、区間最小取得ができる遅延セグ木を貼ってガチャガチャしていたが解けなかった