コンテスト中AC:A〜E
NOMURA Programming Contest 2022(AtCoder Beginner Contest 253) - AtCoder
B - Distance Between Tokens
マンハッタン距離に関する問題です。
'o'
である2箇所をとすれば、答えは、
です。
Submission #32006932 - NOMURA Programming Contest 2022(AtCoder Beginner Contest 253)
C - Max - Min Query
多重集合をC++の多重集合
multiset
で解けます。
実装は後ほど記載のリンク参照。
WAを出したのですが、S.erase(i)
をS.erase(x)
にしてしまってあり、こうするとS
の中のx
が全て削除されてしまいます。
補足ですが、S
に追加される個数が高々個なので、削除される回数も全体で高々
回です。
Submission #32020504 - NOMURA Programming Contest 2022(AtCoder Beginner Contest 253)
D - FizzBuzz Sum Hard
基本的な包除原理です。
から
までの全体の和
から不要なものを引くことを考えます。
までの
の倍数である
の和を
とおきます。
とすると、
の倍数かつ
の倍数であるものを余分に1回引いてしまっています。
そこで、までの
の倍数かつ
の倍数である
の和を
とおきます。
すると、で答えを求められます。
の倍数かつ
の倍数である
は、
と
の最小公倍数を
として、
の倍数となります。よって、
を求めればよいです。
具体的な計算方法です。
まず、は、
です。
は以下のように求められます。
に含まれる
の倍数の個数を
とします。
は下式により求まります。
求めたいものは
なので、
で求められます。
Submission #32025795 - NOMURA Programming Contest 2022(AtCoder Beginner Contest 253)
E - Distance Sequence
としてあり得るのは
なので、数列の状態数は、
個であり、DPできそうです。
数列
の
番目が
であるような数列の個数
このテーブルをの順に更新していくことを考えます。
遷移は、問題文の条件を考えると、
という感じになります(後の説明のために()で括ってあります)。
愚直に1個ずつ足していくと遷移に時間計算量かかり、全体で
となり、間に合いません。
そこで、遷移にかかる計算量を落とせないか考えてみます。
すると、
及び
は連続した区間の和となっています。
このような場合、累積和によって、計算量を落とせます。
具体的には、
とします。但し、便宜上としておきます。
このようにすると、先程の遷移の右辺は、
という風になり、で計算できるようになります。
実装時、いくつか気をつける点があります。
となる可能性があるので、
をとる。
となる可能性があるので、
をとる。
更に、上記2つでそのまま実装すると、の時にコーナーケースとなります(
が2回足されてしまうはず)。
そのため、
のときは、遷移を
とする。
このようにしておけばよいです。
Submission #32041363 - NOMURA Programming Contest 2022(AtCoder Beginner Contest 253)