arc106e-solution
ARC106E Solution
建模:所有店员为左部点,所有日期为右部点。源点连所有左部点,流量 \(k\),店员连他上班的所有日期,流量为 \(1\);所有右部点连汇点,流量 \(1\)。
然后二分右部点个数,看看最大流是否流满 \(nk\)。但是这个跑不动。
\(\texttt{Hall}\) 定理:二分图的所有左部点有完美匹配当且仅当对于每个由左部点组成的集合 \(S\),连到的右部点个数 \(\ge|S|\)。
这个可以推广到这题,每个点匹配 \(k\) 个右部点的情况。于是问题变成求每个左部点集合对应连到多少个右部点。
设 \(N(u)\) 表示与右部点 \(u\) 连边的所有左部点组成的集合。
即对于所有左部点集合 \(S\),求有多少个右部点满足 \(N(u)\) 与 \(S\) 有交。
与 \(S\) 有交等价于 \(N(u)\in\complement_US\),\(\complement_US\) 表示 \(S\) 的补集。
那么就是要求有多少个集合是 \(\complement_US\) 的子集,也就是求子集和。可以用 FWT 或者直接高维前缀和。

浙公网安备 33010602011771号