H - Security Camera Editorial by kyopro_friends


この問題は半分全列挙で解けます。

頂点集合を互いに素な \(V_1,V_2\)\(2\) つ分けます。辺集合を \(E\) とします。

\(V_1\) の頂点集合に改めて番号を振り直し \(0,1,\ldots |V_1|-1\) とし、 \(V_1\) の部分集合と \(0\) 以上 \(2^{|V_1|}-1\) 以下の整数を同一視します。これにより、和集合・積集合・対称差などを求める操作は \(O(1)\) でできるとしてよいです。

\(V_1,V_2\) のうちカメラをおく頂点集合をそれぞれ \(S,T\) に決めたとき、監視される辺の個数は包除原理により「\(S\)から監視される辺の個数」+「\(T\) から監視される辺の個数」-「\(S,T\) 両方から監視される辺の個数」です。最初の2つは \(S,T\) からそれぞれ容易に求められるため、最後のものを求める方法を考えます。

\(S,T\) が disjoint であることと、グラフが単純であることから
\( \#\{(v,u)\in E\mid v\in S, \ u \in T\}\\ =\sum_{u\in T}\#\{(v,u)\in E \mid v\in S\}\\ =\sum_{u\in T}\#\{v\in S \mid (v,u)\in E\}\)
であり、さらにいま必要なのはこの値の \(\bmod 2\) であることから 、

\( \sum_{u\in T}\#\{v\in S \mid (v,u)\in E\} \bmod 2\\ = \#(\bigoplus_{u\in T}\{v\in S \mid (v,u)\in E\})\bmod 2\\ = \#(S\cap \bigoplus_{u\in T}\{v\in V_1 \mid (v,u)\in E\})\bmod 2\)

となります。(\(\bigoplus\) は集合の対称差)
ごちゃごちゃした部分を記号で置いておきましょう。つまり、\(f:\mathcal{P}(V_2)\to \mathcal{P}(V_1)\)\(f(T)=\bigoplus_{u\in T}\{v\in V_1 \mid (v,u)\in E\}\) と定めます。(\(f\) は「\(V_2\) の部分集合 \(X\) を決めたとき、そこから奇数回見えるような \(V_1\) の集合を返す」という関数)
\(u\in T\) に対して \(\{v\in V_1 \mid (v,u)\in E\}\) を求めておくことで、\(f\)\(O(N2^{N/2})\) で前計算できます。

これで問題は、「全ての \(S,T\) の組のうち、『\(S\) から監視される辺の個数』+『\(T\) から監視される辺の個数』- \(\#(S\cap f(T))\) が偶数となるようなものの個数を求めよ」となりました。\(T\) のかわりに \(f(T)\) で考えます。

\(D_1,D_2\) を次のように定めます。
\(D_1[flag][S]=\) \(\#\{X \subset V_1 \mid \) \(X=S\)、かつ、\(X\) にカメラを置いたとき監視される辺の個数 \(\bmod 2\) がflag \(\}\)
\(D_2[flag][S]=\) \(\#\{X \subset V_2 \mid \) \(f(X)=S\)、かつ、\(X\) にカメラを置いたとき監視される辺の個数 \(\bmod 2\) がflag \(\}\)
これらは \(X\) に関して愚直に全探索することで \(O(N^2 2^{N/2})\) で求めることができます。(適切な実装により \(O(N 2^{N/2})\) で求めることもできます)

このとき求める答えは、\(flag_1+flag_2-\#(S_1\cap S_2)\) が偶数であるような全ての \((flag_1,S_1,flag_2,S_2)\) の組についての \(D_1[flag_1][S_1]*D_2[flag_2][S_2]\) の和です。これは、\(flag_1,flag_2\) を固定するごとに \(D_1[flag_1]\)\(D_2[flag_2]\) の and convolution を用いて \(O(N 2^{N/2})\) で求めることができるため、全体で \(O(N^2 2^{N/2})\) ないし \(O(N2^{N/2})\) で問題を解くことができました。

posted:
last update: