mini notes

競技プログラミングの解法メモを残していきます。

ARC014 D - grepマスター

問題:D - grepマスター

解答:Submission #13607531 - AtCoder Regular Contest 014

解法:-B x -A yの時にどれだけ追加的にヒットするかを確認する。
1~L1まではmin(L1-1, x)個、
L1+1~L2-1まではmin(L2-L1-1, x+y)個、
L2+1~L3-1まではmin(L3-L2-1, x+y)個、

L[n-1]+1 ~ L[n]-1まではmin( L[n] - L[n-1]-1, x+y)個、
L[n]+1~allまではmin(all - L[n], y)
である。最初と最後以外は同じような式になっている。

min( L[i] - L[i-1]-1, x+y)はx+yを変数と見たときに、
x+y ≦ L[i] - L[i-1] であるときは(x+y)が1つずつ増えていくと1つずつ増えていくが、
x+y > L[i] - L[i-1] であるときは(x+y)が増えても L[i] - L[i-1] で頭打ちされる。
よって、各iについてmin( L[i] - L[i-1]-1, x+y)を見ると、x+yによって、頭打ちになるか増加しているかのいずれかであるので、 頭打ちになるポイントごとに計算を切り替えるような仕組みにすればよい。

あるx+yについて、その時点で頭打ちになっているものがcnt個、頭打ちになったものの数値の合計をsmとすると、
(両端以外の)それ以外の部分は増加してx+yが採用されるので、両端以外の数値はn + (n-1-cnt) * (x + y) + sm で表される。
両端(min(L1-1, x), min(all - L[n], y)) は毎回計算すればよい。