做题记录 26.2.14

\(\textcolor{black}\odot\) P10104 [GDKOI2023 提高组] 异或图

先考虑 \(m=0\) 的情况

\(C(a_{1\sim n})\)\(b_{1\sim n}\mid b_i\le a_i,\bigoplus b_i=0\) 的数量

对于 \(c=0\) 的情况转化为求 \(C(a_{1\sim n})\),否则转化为求 \(C(a_{1\sim n}:c)-C(a_{1\sim n}:(c-1))\),其中 \(:\) 表示追加

因此考虑如何计算 \(C\)

\(v[x]\) 表示 \(v\) 的第 \(x\)

\(d_i=a_i-b_i\),考虑枚举 \(\max d_i\) 的最高位为第 \(x\) 位(\(b=a\) 的情况特判即可)

\(a\)\(x\) 位以上部分的异或和不为 \(0\) 则无贡献,跳过

否则设 \(a\)\(x\) 位及以下部分为 \(a'\),需要选择偶数个 \(a'_i\)(显然不能全选)满足 \(a'_i[x]=1\)\(b'_i[x]=1\),剩余的 \(b'_i[x]=0\),从没有被选择的 \(a'_i[x]=1\) 中固定一个,非固定的 \(a'\) \(0\sim x-1\) 位任意填,固定的 \(a'\) 可以将低位的异或和调到 \(0\)

容易 \(dp\) 做到 \(O(n\log V)\)

然后考虑 \(m>0\) 的情况

枚举边子集 \(E'\),对于 \(E'\) 产生的一个连通块,其中所有点的 \(b\) 相同,求出此时的方案数,容斥系数为 \((-1)^{|E'|}\)

考虑枚举连通块的划分方式,一种划分方式中,大小为偶数的连通块对应方案数为 \(\min a+1\),大小为奇数的连通块只需要保留 \(\min a\),对所有保留的 \(\{a\}\) 求出 \(C(a)\) 后乘以偶数连通块的贡献即为总方案数,容斥系数为每个连通块 \(S\subset[1,n]\)\(g_S\) 之积,其中 \(g_S\) 表示点集 \(S\) 的导出子图中选出若干边使 \(S\) 连通的方案数,容易 \(O(3^n)\) 求出 \(g\)

这样可以做到 \(O(B(n)n\log V)\),其中 \(B(n)\) 表示 \(\text{Bell}\)

发现答案形如 \(\sum_{S\subset [1,n]} C(\{a_i\mid i\in S\})\times f_S\),其中 \(f_S\)\(C\) 无关,考虑如何计算 \(f\)

对于一种划分方案,对应的 \(S\) 为全体大小为奇数的连通块内 \(a\) 最小的点的集合,对 \(f_S\) 的贡献为每个连通块的 \(g\) 之积乘以偶数连通块的 \(\min a+1\) 之积

考虑从小到大加入 \(a\)\(dp_S\) 中对于已经加入的 \(a_x\)\([x\in S]\) 表示是否令 \(a_x\) 为一个奇连通块的 \(\min a\),对于还没有加入的 \(a_x\)\([x\in S]\) 表示是否已经将 \(a_x\) 加入某一连通块,转移时枚举当前点所在连通块即可

时间复杂度 \(O(n3^n+(m+n\log V)2^n)\)

代码

参考

\(\textcolor{black}\odot\) CF1768F Wonderful Jump

定理 \(1\):最优解中,一次跳跃 \(i\to j\)\(a_{i\sim j}\) 的最小值一定在 \(a_i,a_j\) 之一

证明:若不是,设最小值为 \(k\mid i<k<j\),则 \(i\to k\to j\) 一定不劣

定理 \(2\):对于一次跳跃,若范围内的最小值为 \(a_i\),则跳跃的距离一定不超过 \(\frac n{a_i}\)

证明:若超过,则不如每次跳一步

由此令 \(dp_i\) 表示 \(1\to i\) 的最小代价,枚举 \(a_i\) 为最小值,向前向后分别跳不超过 \(\frac n{a_i}\) 步,若扫到 \(\le a_i\) 的位置则退出

定理 \(3\):此算法时间复杂度为 \(O(n\sqrt n)\)

证明:对于 \(a_i>\sqrt n\) 的部分显然总步数为 \(O(n\sqrt n)\),对于 \(a_i\le \sqrt n\),每个值的总贡献不超过 \(O(n)\),因此总时间复杂度 \(O(n\sqrt n)\)

代码

参考

\(\textcolor{black}\odot\) AT_arc045_d [ARC045D] みんな仲良し高橋君

先对于一个点集判断是否存在完美匹配

对于点 \((x,y)\),连边 \(x^L-y^R\),选择一组匹配相当于删去两条共顶点的边,可以删空则合法

归纳可证合法当且仅当每个连通块边数都是偶数

然后考虑原问题,先建图,转化为对于每条边,判断删去后剩余的每个连通块是否都含偶数条边

若存在两个及以上连通块含有奇数条边则全都不合法

显然至少一个连通块含有奇数条边

若恰好一个连通块含有奇数条边,此连通块外的边必然不合法,连通块内求出任意 \(\text{DFS}\) 生成树,树之外的边必然合法,树上非割边必然合法,树上割边取决于子树中边数的奇偶性

容易做到 \(O(n)\)

代码

参考

posted @ 2026-02-16 10:18  Hstry  阅读(1)  评论(0)    收藏  举报