ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

精進メモ 2021/05/17~

圧倒的睡眠不足になりました。毎日10時間は寝たいです。

競プロ典型 90 問

042 - Multiple of 9(★4)

最終的に作成した数が9の倍数になるかどうかは、Kが9の倍数かどうかで決まります。
Kが小さいので、dp[i] =桁和がiになるような数のパターン
としてDPできます。

043 - Maze Challenge with Lack of Sleep(★4)

一つ前は縦、横どっちから来たか、を添え字に持ってDPです。
01BFSになります。

045 - Simple Grouping(★6)

ある集合に対して部分集合を列挙するのを高速にすると、任意の集合に対して部分集合を走査するのが3^{N}で収まるテクを使います。
グループ数と、既に決めた点の集合を持ったDPです。

046 - I Love 46(★3)

modでまとめて、個数の配列に直すテクを使います。
あとは雑に3重ループでも大丈夫です。

047 - Monochromatic Diagonal(★7)

対角線は、縦のprefixと横のsuffix、もしくはその逆で長さが同じものを列挙するのと同じです。
縦のprefixに対して、それを用いた対角線が最終的にある色になると決め打つと、横のsuffixが満たすべき文字列は一意に定まります。
満たすべき文字列は、一番長い対角線上に対するものさえ求めておけば、あとは連続部分文字列になります。
連続部分文字列と、横のpre(suf)fixの一致はローリングハッシュを使えばOKです。これを全ての色に対してチェックします。

ABC202

D - aab aba baa

パスカルの三角形を利用して、\  _{n}C_{k}を求めておけば、前から決まっていきます。
a , b がそれぞれa,b個のとき、\ _{(a + b - 1)}C_{a-1} \leq Kを満たしていれば、 a を選べばよいです。a = 0、もしくは上の条件を満たさない時は b を選びます。

E - Count Descendants

すごい好きです。
オイラーツアーをします。(u,d)というクエリがあった際、オイラーツアー中にuに入ったタイミングで、(それまでに通った、根から距離dの頂点の個数)を引きます。
uから出るタイミングで、(それまでに通った、根から距離dの頂点の個数)を足します。すると、(u,d)に対する答えが求まっています。
(u,d)Qパターンしかないですから、クエリを先読みし、1回のDFSで上記の計算を全部やってしまえば間に合います。
オイラーツアーとは言いましたが、オイラーツアーのライブラリは全く必要ない(ただDFSするだけ)ので、実装も軽いです。他のいろいろなライブラリを使う必要もありませんでした。

ARC120

A,C,Dの速度は良かったのですが、Bで詰まりすぎました。

A - Max Add

まず、a_{1} \ldots a_{k}の最大値がk回足されます。
あとは、\sum_{i = 1}^{j-1} a_{i}jに対して足されます。
あとは、足される数の総和を、前から累積和を取りつつ計算していけば良いです。

B - Uniformly Distributed

まわりが全員通していたのですごい焦りました。
左下から右上に線を引いていくと、その斜線上で色が統一されていなければなりません。
あとは、そこで違う色が含まれていたら0、そうでなければ、全て色が決まっていない個数pに対して2^{p}が答えです。

RB.が混在していても2倍をしていて、ペナを出しました。

C - Swaps 2

a_{i} = a_{i }  + iと置き換えます。bも同様です。
こうすると、与えられた操作は隣接2点のswapです。
数列の要素が異なる場合-1です。 それ以外の場合、転倒数を求める問題に帰着できます。

D - Bracket Score 2

上からN番目に大きい値までに +、そうでない方に -を割り振るよう、括弧列を作れば理論値になります。
先頭は ( にしなければならないため、 (とします。その際、+- どちらだったかをメモします。
それ以降、閉じカッコが対応していない開き括弧が存在する限り、メモした符号と同じであれば (を追加し、そうでなければ)を追加して開き括弧を一つ消します。
対応していない開き括弧がなくなったら、最初の操作に戻ります。
これを繰り返すだけで理論値に対応する括弧列が作成できます。
一か所だけ配列サイズを間違えてNにしてしまい、1ペナしました。