ferinの競プロ帳

競プロについてのメモ

cf #427 div2 D. Palindromic characteristics

問題ページ
Problem - D - Codeforces

問題概要

k-palindromeを以下のように定義する。

  • 文字列の左半分と右半分が空文字列ではなく一致している
  • 左半分と右半分がともに(k-1)-palindromeである

1-palindromeは通常の回文と同様である。
文字列sが与えられる。この文字列に含まれる連続する部分文字列においてk-palindrome(1<=k<=|s|)の数はそれぞれ何個あるか求めろ。

解法

dp[l][r] = (lからrまでの部分文字列で最大のk)とおいたDPを考える。
lからrまでの文字列がk-palindromeである条件はlからrまでの文字列が回文であり、左半分が(k-1)-palindromeであることである。したがって、小さい幅の部分文字列の情報を先に得たいため、小さい幅のものから順番に計算していく。
l = r のときは明らかにdp[l][r] = 1
l = r-1 のときは s[l] = s[r] ならば dp[l][r] = 2、s[l] != s[r] ならば dp[l][r] = 0 となる。
これ以外のときは

  • s[l] != s[r] または dp[l+1][r-1] であれば回文にはなりえないため dp[l][r] = 0
  • それ以外の場合、左半分のdpの値+1が求める値になるため dp[l][r] = dp[l][m] + 1 (ただし m = ceil((l+r)/2) - 1)

となる。これはO(|S|^2)で計算できる。
ここでk-palindromeは(k-1)-palindromeでもあることを利用すると、k-palindromeの数はdp[l][r]の値がk以上の個数であると言える。cnt[k] = (dp[l][r] = kの数) として、後ろから累積和を取ることで、各k-palindromeの数を求めることができる。

cf #427 div2 C. Star sky

問題ページ
Problem - C - Codeforces

解法

t秒目での各星の明るさは(s[i]+t) % (c+1) で求められる。星の明るさは周期c+1で同じものが現れるのでc+1回分2次元累積和を取っておいて各クエリにO(1)で答える。同じ地点に複数の星が存在するケースがあることに注意。

cf #426 div2 C. The Meaningless Game

問題ページ
Problem - C - Codeforces

考えたこと

色々数字をいじっていたらそれっぽい解法が思いついて投げたら通った。
gcdを求めたあと素因数分解をしたくなったが、a、bが大きな素数のときに計算時間が怖かったのでこの方針は捨てた。
立法数判定だけなら時間は問題なさそうなのでこの方針で考えると、gcd/{(a/gcd)*(b/gcd)}が立法数か判定したらサンプルや手元で作ったケースを通ったのでこれで投げたら通った。

ARC079 F Namori Grundy

問題ページ
F - Namori Grundy

解法

0以上a[i]未満の整数xが頂点iから辺が伸びている頂点jの値a[j]として全て使われているようなa[i]の決め方をする。
すなわち、a[i]から辺が伸びている頂点jの値として使われていない最も小さい値がa[i]の値となる。

サイクル以外の頂点の値a[i]は葉から順番に見ていくことで簡単に決められる。
サイクル上の適当な頂点を一点取ったとき、その頂点が取りうる値は、

  • その頂点に辺が入る頂点の値として使われていない最も小さい値
  • その頂点に辺が入る頂点の値として使われていない二番目に小さい値(サイクル上で頂点iに入る辺を持つ頂点jが最も小さい値を取る場合)

の2つしかありえない。

サイクル上の1頂点の値が決まればサイクル上の残りの頂点の値も順に決まっていく。この2パターンで成立するものがあれば"POSSIBLE"、なければ"IMPOSSIBLE"となる。

学んだこと

なもりグラフでサイクル外の頂点だけを探索する方法
grundy数の定義

ARC079E Decrease (Judge ver.)

問題ページ
E - Decrease (Judge ver.)

解法

a[i]がn以上であればn未満になるように引き、数列の他の要素に適切な値を加えることを繰り返した。
最初からn未満になるように操作すると途中で遷移がバグってるところがあったので一回 7*n 未満になるように操作したあと n未満になるように操作したら通った(ア
正当性の証明を一切してないすごい怪しいコードになった。