好题璇姐

1. 最小限定度数生成树

Codechef题面 GF题面
简要题意:给定一张带权无向图,保证 1 向其它点都有边,且去掉 1 后剩下的图联通。对 \(k\in[1,n-1]\) 求点 1 度数为 \(k\) 时的最小生成树权值和。\(n,m\le 3\times 10^5\)

思路:

  1. 先从 1 向所有其它点都有边开始考虑。假设我们已经知道按什么顺序加边了,那么每次我们会删掉哪条连向 1 的边呢?是当前这条边所在左右两个连通块 \(A,B\) 中权值最小的点 \(min_A,min_B\) 的较大值。于是我们加这么一条边对整棵生成树的权值和的影响是增加了 \(w_e-\max(min_A,min_B)\),称之为这条边的“价值”。(为什么是 \(min\)?因为更大的1边一定已经删掉了)
    又由 定理2 得知,每次贪心选价值最小的边就是最优解。现在我们只要能迅速算出每条边的价值即可。
  2. 有一个发现:当连接所有 \(w\le w_e\) 的边时,\(\max(min_A,min_B)\) 即为最终的 \(\max(min_A,min_B)\)
    证明:一方面,设取到 \(min_A\) 的点为 \(u\),取到 \(min_B\) 的点为 \(v\),则 \(e\) 一定是路径 \((u,v)\) 上权值最大的边(否则肯定不会删它)。于是 \(u,v\) 一定都已经连上了。
    另一方面,如果连着一个 \(ww(v_0)<ww(v)\),那么由原来的“加上 \(e\) 删掉 \(v\)”改为“删掉 \(e_0\) 加上 \(v_0\)”(其中 \(e_0\) 是通往 \(v_0\) 的一条边),由于 \(w_{e_0}\le w_e,ww(v_0)<ww(v)\),显然后者更优,矛盾。
    于是就按 \(w\) 从小到大连,维护连通块最小值,排个序就做完了。

2. 全排列逆序对 \(k\) 次方和

PTZ题面 QOJ题面
\(F_t(z)=\sum\limits_{i=0}^{t-1}z^t\),则令 \(G=\prod\limits_{t=1}^n F_t\),答案即为 \(\sum i^kg_k\)

接下来,是一系列神奇而经典的操作。

首先,考虑改为算期望,由于 \(k\) 次方可以转为若干个组合数之和,所以组合意义为若干种选 \(2k\) 个位置的方案数,于是答案为关于 \(n\)\(2k\) 次方多项式
然后,\(i^k\) 很恶心,变成下降幂导数就出来了:

\[\sum i^kg_iz^i=\sum\limits_{j=1}^k \Big\{ \begin{matrix} k \\ j \end{matrix} \Big\} \sum i^{\underline{j}}g_iz^i=\sum\limits_{j=1}^k \Big\{ \begin{matrix} k \\ j \end{matrix} \Big\}G^{(j)}(z) \]

接着,运用莱布尼茨公式

\[(uv)^{(k)}=\sum \binom{k}{i} u^{(i)}v^{(k-i)} \\ \Rightarrow \sum G^{(i)}{z^i\over i!}=\prod\ \sum F_t^{(i)}{z^i\over i!} \]

再接着,小学奥数:

\[F_t^{(p)}=\sum\limits_{i=p}^{t-1}i^{\underline{p}}=(1\cdot 2\cdot \cdots \cdot p)\cdot (2\cdot 3\cdot \cdots \cdot (p+1))\cdot \cdots \cdot ((t-1)\cdot t\cdot \cdots \cdot (t-1+p-1))={1\over p+1}((t-1)\cdot t\cdot \cdots \cdot (t-1+p))={(t-1+p)^{p+1}\over p+1} \]

最后,对 \(n!\) 分段打表,就做完了。

3. 图上动态点亮边数问题

\(\texttt{From} \color{black} \texttt{ w} \color{red} \texttt{lxhkk}\)

题意: 给一张 \(n\) 个点 \(m\) 条边的图,每次操作会改变一个点的点亮状态,并询问有几条边满足其两个端点都被点亮。\(n,m\le 10^5\)

考虑根号分治。发现度数大于 \(\sqrt{m}\) 的点最多只有 \(O(\sqrt{m})\) 个,这是一个很重要的性质。

称度数大于 \(\sqrt{m}\) 的点为大点,其余的点为小点

当修改小点时,由于其度数不超过 \(\sqrt{m}\),可以暴力修改。

当修改大点时,贡献分为两种:小点对大点的贡献,以及大点对大点的贡献。

对于前者来说,大点不好维护,所以考虑让小点贡献到大点上面,即每个小点的点亮情况贡献到其周围的大点,每个大点维护一个 cnt 即可。

对于后者来说,由于大点最多只有 \(O(\sqrt{m})\) 个, 所以可以直接暴力枚举大点进行更新。

总共的复杂度就 \(O(n\sqrt{m})\)

posted @ 2022-04-08 19:56  CharlieVinnie  阅读(54)  评论(0编辑  收藏  举报