これを読解した
Submission #27805654 - AtCoder Beginner Contest 220
参考にしたツイート
これやっと読解できた気がする
— さんせん (@akakimidori) 2022年6月13日
適切に行列作ると求めたいものは二次形式の値が偶数になるような01ベクトルの個数になる
問題の性質から作れる操作と直交変換かますことで3重対角行列になる
あとはDP https://t.co/TQmiButUHQ
なお以下の説明は、これらを自分なりに再解釈したものであり、#27805654の実際の実装は異なっているので混乱のなきよう
・を、かつ間に辺があるとき1、それ以外0とする。を頂点にカメラを置かないとき1、それ以外0とする。
・監視されていない辺の個数はなので、が偶数になるようなXの個数がわかれば十分。
・行列の成分をとみなして、を考えれば良い。
・正則行列PによってAをに置き換えてもを満たすXの個数は変わらない。
・適切な正則行列Pを取ることでを二重対角行列にできる(←?)
・二重対角行列に変換したあとの行列を元の問題に戻すと、「パスグラフに自己辺がいくつかついたものの上で問題を解いてください」となり、自明にO(N)DPができる
「適切な正則行列Pを取ることでを二重対角行列にできる」というのは嘘です。
しかし、よく考えると、任意のでとをswapしてもの値は変わらないので、「i行目を使ってi-1列目の成分を掃き出すとき、i行目に溜まった邪魔な成分はi列目に押しつける」とする掃き出し法で二重対角行列にできます。
おわり
追記
二重対角行列って言葉は存在しないらしいです。ここで二重対角行列と呼んだものは、帯行列の1,0のパターン、すなわち、三重対角行列かつ下三角(or上三角)なもののことを意図しています