はじめに
この記事では、AtCoder Beginer Contest 166のA~F問題を解説します。
A - A?C
https://atcoder.jp/contests/abc166/tasks/abc166_a
if文が簡単です。
1 | S = input() |
B - Trick or Treat
https://atcoder.jp/contests/abc166/tasks/abc166_b
setを使って、お菓子を持っているすぬけ君のユニーク数を数えます。
1 | ls = [] |
C - Peaks
https://atcoder.jp/contests/abc166/tasks/abc166_c
M件の道情報それぞれに対して、良くない展望台が確定していきます。計算量はO(M)です。
隣接する展望台の高さが同じ場合も、良い展望台とはならないことに注意しましょう。
1 | N, M = map(int,input().split()) |
D - I hate Factorization
https://atcoder.jp/contests/abc166/tasks/abc166_d
Aの符号とBの符号を(Aの符号, Bの符号)のように表現します。
Xは正のため、(-,+)のパターンを考慮する必要はない(-,-)のパターンについては、A, Bの絶対値を入れ替えて符号を(+,+)とすることで等価なパターンが存在する。
これらの考察からAを非負として扱っても一般性を失いません。
またA<=Bの時、A^5-B^5<=0となり制約を満たさなくなるので、A>Bとします。
ここから解説pdfのように考えます。
A=n, B=A-1すなわちn^5-(n-1)^5について考えます。
先の議論からAが非負として、n^5-(n-1)^5は単調増加です。
そしてnを1ずつ増やして探索すると、n^5-(n-1)^5が10**9を超えるのはn=120の時です。すなわちAは119まで評価すればよく0<=A<=119となります。A=n, B<A-1の場合について考えます。-B^5は単調減少であるため、BがA>Bの制約の元でどのような値をとっても、n^5-(n-1)^5はA=120で10**9を超えるはずなので、やはりAは119まで評価すれば十分です。
ここまでで
1 | 0<=A<=119 |
です。
最後にBの下限について考えます。A=0の場合、すなわち-(B^5)についてBを1ずつ小さくして探索するとB=-64で初めて10**9を超えます。先ほどと同様の議論で、Bの下限を-63としても問題ないことがわかります。
1 | 0<=A<=119 |
この範囲であれば、全探索をしても全く問題がありません。
1 | import sys |
E - This Message Will Self-Destruct in 5s
https://atcoder.jp/contests/abc166/tasks/abc166_e
身長+番号(A[i]+(i+1))と 身長-番号(A[i]-(i+1))を事前に計算しておき、引いて0になる組み合わせを数え上げれば良いです。
前者のパターンを辞書として作成し、後者のパターンのクエリをループすれば良いです。
ここで、
- ペアの組み合わせではなく、順列を考えている
- 自身と比較しても、身長が正であることから条件を満たし得ない
- 番号の差の絶対値ではなく、番号の差を考えている。
自身以外との番号は必ず異なる上、番号は非負なので、順列(p,q)の番号の差p-qと順列(q,p)の番号の差q-pは必ず異なる。そのため、各ペアに対して重複してカウントする心配はない。
1 | N = int(input()) |
F - Three Variables Game
https://atcoder.jp/contests/abc166/tasks/abc166_f
解説pdfではA+B+Cの値に着目している。
クエリsiの文字列をL,Rとしてカウンタd[L]に着目しても解くことが出来る。
1 | S = [] |
関連記事
過去のABC解説記事です。
記事情報
- 投稿日:2020年5月4日
- 最終更新日:2020年5月4日