メモ

yukicoderでゆるふわgolf

ABC220Ex O(N^3)解法

これを読解した
Submission #27805654 - AtCoder Beginner Contest 220

参考にしたツイート

なお以下の説明は、これらを自分なりに再解釈したものであり、#27805654の実際の実装は異なっているので混乱のなきよう

A_{i,j}を、 i< jかつi,j間に辺があるとき1、それ以外0とする。X_iを頂点iにカメラを置かないとき1、それ以外0とする。
・監視されていない辺の個数はQ_A(X):=\sum_{i,j}A_{i,j}X_iX_j={}^tXAXなので、Q_A(X)が偶数になるようなXの個数がわかれば十分。
・行列の成分を\mathbb{F}_2とみなして、Q_A(X)=0を考えれば良い。
正則行列PによってAを{}^tPAPに置き換えてもQ_A(X)=0を満たすXの個数は変わらない。
・適切な正則行列Pを取ることで{}^tPAPを二重対角行列にできる(←?)
・二重対角行列に変換したあとの行列を元の問題に戻すと、「パスグラフに自己辺がいくつかついたものの上で問題を解いてください」となり、自明にO(N)DPができる


「適切な正則行列Pを取ることで{}^tPAPを二重対角行列にできる」というのは嘘です。
しかし、よく考えると、任意の(i,j)A_{i,j}A_{j,i}をswapしてもQ_A(X)の値は変わらないので、「i行目を使ってi-1列目の成分を掃き出すとき、i行目に溜まった邪魔な成分はi列目に押しつける」とする掃き出し法で二重対角行列にできます。

おわり

追記
二重対角行列って言葉は存在しないらしいです。ここで二重対角行列と呼んだものは、帯行列の1,0のパターン、すなわち、三重対角行列かつ下三角(or上三角)なもののことを意図しています