0%

JBY-practice-3

CF888G(异或最小生成树)

以前的自己搞的做法是错误做法,搞下正确做法。、

Kruskal思想做法

建出01Trie树,发现子树内连边肯定小于子树外的,由Kruskal的理论可以得出只需要对同时有0,1子树的那些点,两个子树中找最小的边连起来即可,时间复杂度为 \(O(n\log^2V)\)

Boruvka

直接用Boruvka算法,每一轮直接暴力重新用Trie树求出最小的边,复杂度 \(O(n\log V\log n)\)

CF51F

由于最后要求不能有重边,发现对于任意一个边双最后都必须缩点缩成一个点。缩了之后就变成了森林,先单独处理每一棵树,最后花连通块个数减一的代价合并。考虑一棵树的情况的代价,若是选定了一条链,那么对于链的每一棵子树,最后保留缩成叶子个数个点,那么将贡献写出来发现只要直接取直径答案就是最优的了。

CF1767E

发现等价于相邻的两个位置的两种颜色至少要选一种,把所有一定选的点排除后,建出图来发现是一般图的最小权点覆盖问题,转化为求补图的所有的极大团。

CF1770F

对于每一位单独考虑答案,那么最后就是求这一位异或为1的方案的方案数数模2,对于其他位显然有生成函数 \((1+x^{2^k})^{n}-1\),由于最终答案对2取模,由库默尔定理有 \((1+x^{2^k})\equiv(1+x)^{2^k} \pmod{2}\),那么对于这样的函数的乘积就可以用 \((1+x)^p\) 表示了。而对于当前计算的位,由于只计算奇数个的情况,需将偶数项清0,但是由于最终答案对2取模,不能使用 \(\frac{(1+x^{2^k})^n-(1-x^{2^k})^n}{2}\)。然后发现 \((1+x^{2^k})^n-(1+x^{2^k})^{n\&~1}\) 可以作为其生成函数,讨论一下奇偶性即可证明,而这个表达式依然可以写成上面的形式,那么最后只需枚举每一位是前一项还是后一项计算即可时间复杂度为 \(20*2^{20}\)

ARC092F

对于本身在同一个SCC里的边和不同的边分开讨论,容易发现,不在SCC里的边影响当且仅当两点间不止这一条路径,而在SCC里的边则与此相反。于是问题变成了对于每一条边,求不经过它,起始点能否走到终止点。直接对每一个点,边正反个跑一遍求可达性最后合并就可以求不经过某条边的可达性了,使用bitset可以做到 \(O(\frac {n^3}{64})\)

NOI2021 D1T3

梦中情场,后悔当时没买到 C 没考虑买 D,先考虑题目给的性质是什么意思,发现就是说缩点后,可达性可以简化为一棵树,那么就直接缩点建树,然后就转化为了一个外向树上的问题,手玩一下,发现答案是若干链组成的,最后就是求树链的并就是了。

AGC060D

对于确定的集合 \(S\) 为排列中递减位置的集合,那么其对答案的贡献为 \((Cnt(S))^2\) 即满足 \(S\) 这个限制的排列数的平方,而要计算 \(Cnt(s)\) 可以考虑容斥,有 \(Cnt(s)=\sum_{t\subseteq s}c(t)(-1)^{\vert t\vert - \vert s\vert}\),其中 \(c(t)\) 为若 \(i\not\in t\),则 \(p_i<p_{i+1}\) 的方案数,那么有 \(Cnt(s)^2=(\sum_{a\subseteq s}c(a)(-1)^{\vert a\vert})(\sum_{b\subseteq s}c(b)1)^{\vert b\vert})\),不妨令\(f(a)=c(a)(-1)^{\lvert a \rvert}\),那么答案可以表示为 \(\sum_{s}\sum_{a,b\subseteq s}(f(a)f(b))\),变形得 \(ans=\sum_{a,b}(f(a)f(b)2^{n-1-\vert a\cup b\vert})=\sum_{a,b}(f(a)f(b)2^{n-1-\vert a\vert -\vert b\vert+\vert a\cap b\vert})\),整理得 \(2^{n-1}\sum_{a,b}(\frac{f(a)}{2^{\vert a\vert}}\frac{f(b)}{2^{\vert b\vert}}2^{\vert a\cap b\vert})\),对于最后一部分可以写成 \(\sum_{c\subseteq a,c\subseteq b} 1\),那么又可以变形得 \(ans=2^{n-1}\sum_c(\frac{f(a)}{2^{\vert a\vert}})^2\),考虑如何求解,发现有对于一个 \(c\) ,若用二进制表达,那么它有若干段连续的 1和 0 构成,而对于 0 段,不同 0 段间的 \(f\) 的计算是不会干扰的,那么另 \(g(N)=(\frac{\sum_{a}(\frac {f(a)}{2^{\vert a\vert}})}{N!})^2\),其中 \(a\) 为所有的 \({1,2,...,N}\) 的子集,那么答案就是对若干段 0 的拼接,那么写出生成函数 \(G=\sum_kg(k)x^k\),那么最后就是对函数 \(G\) 的拼接,答案就是 \(2^{n-1}[x^n]\frac{(n!)^2}{1-G}\),而对于 \(G\) 的计算,将 \(f\) 写出可以发现是 \(f\) 的拼接,再将每项平方。