AtCoder Beginner Contest ABC428 解法メモ
文中で使用しているのは、たとえCodonが使えようとも、同じくPythonライクでAtCoderに最適な言語の1つNimです
ABC428
ABC428A - Grandma's Footsteps
解法
残り時間、つまり、X mod (A+B)(ただし、最大
と考えればよい
ACコード
メモ
怖くなって、時刻tを置いて、シミュレートした
ACコード
ABC428B - Most Frequent Substrings
解法
制約から、
最大回数となった文字列をソートして答えればよい
c:Table[string,int]に出現回数を数えていけば、c.values.toSeqの最大値が
c.pairs.toSeqでvalueが
ACコード
メモ
最後にソートし忘れてWA
ABC428C - Brackets Stack Query
解法
良い括弧列とは、
括弧列を"("を
途中にマイナスの項がなく、かつ、その最終項が
よって、累積和と、その累積和の途中にマイナスになる項があれば、その最初の位置を管理していけばよい
初項の
クエリ
それが負になっていて、かつ、p==0ならp=s.len-1に更新
クエリ
s.popした上で、
s.len==pになっていたら、p=0に戻せばよい
クエリの都度、
ACコード
メモ
クエリ
ABC428D - 183184
解法
正整数
この問題では
そこで、
そこに、
C*10^i+max(10^(i-1),C+1)~C*10^i+min(C+D,10^i-1)の間の平方数を求めればよい
(C*10^i+min(C+D,10^i-1)).isqrt-(C*10^i+max(10^(i-1),C+1)-1).isqrtを足し合わせていけばよい
ここで、isqrtとは、整数平方根をニュートン法で求める方法で、.float.sqrt.intとしてしまうと小数の誤差でWAとなってしまう
ACコード
メモ
そもそも、正整数
isqrt(ニュートン法で整数平方根を求める方法)を知らない
ABC428E - Farthest Vertex
解法
木の各頂点からの最遠頂点を求めていく、という問題ゆえ、全方位木DPが有効である
最長距離と、その頂点番号を情報に持てば、
部分木のマージは最長距離が長い方とその頂点番号、同じなら、頂点番号の大きい方とすればよく、
自身から子への辺移動は、最長距離に
まずは頂点
dp[頂点
その上で、初めに
その過程で、各頂点のすべて部分木の情報をマージした情報から、その頂点からの距離が最大となる頂点の番号を記録していけばよい
ACコード
全方位木DPライブラリ
メモ
最遠点からの最遠点で木の直径が求まる、というが、その感覚がつかめない
この機会に全方位木DPに触れる
Discussion