做题记录 26.2.21

QOJ #892. Minimal Cut

显然最小割的两个集合分别为环上的一段区间,令 \((i,j)\) 表示两个区间结束位置分别为 \(i,j\) 的状态

则一条边对割的贡献可以拆分为四个矩形加

使用最小割树,转化为 \(O(n)\) 个若干矩形求 \(\min\)

建出最小割树后,统计答案是容易的

由此转化为 \(O(m)\) 个矩形加,\(O(n)\) 个矩形求 \(\min\),且每次查询的第一维都是前缀或后缀

可以树套树或分治做到 \(O((n+m)\log^2 n)\)(可能空间需要卡常),扫描线使用可持久化吉司机线段树可以做到 \(O((n+m)\log n)\)

代码

QOJ #9119. Graph Weighting

一个点双所有生成树权值和相同当且仅当所有边权相同,因此求出图的所有点双,设第 \(i\) 个点双有 \(a_i+1\) 个点,\(b_i\) 条边,则答案为

\[\min a_i x_i^2\\ \text{s.t.} \sum b_i x_i=w\\ \forall i,0\le x_i\le l \]

\(a_i\) 相同的归为一个等价类,令 \(f_x(i)\) 表示只考虑 \(a=x\) 的部分时 \(w=i\) 的答案,显然只有 \(x\mid i\) 的位置有值

\(f\) 的处理是容易的,显然只有 \(O(\sqrt n)\)\(f\),且都是凸的

将它们依次卷积,卷 \(f_x(i)\) 时以 \(x\) 为步长取值,则转化为标准形式的最小加卷积,其中第二个数组下凸

容易做到 \(O(m+\sqrt n k\log k)\)

代码

参考

QOJ #7324. Eulerian Orientation

显然欧拉图的数量为 \(C=2^{m-n+c}\),其中 \(c\) 为连通块数量

权值为选择的边数的平方,考虑转化为在选择的边中先后固定两条

枚举两者为 \(e,f\in E\),分别考虑包含它们的欧拉图数量

\(e=f\) 时,若为割边则显然无解,否则恰好一半的图不合法,对应数量为 \(\frac C2\)

\(e\ne f\) 时,若 \(e,f\) 之一为割边显然无解,若 \(\{e,f\}\) 为一组割,则恰好一半的方案合法,数量为 \(\frac C2\),若不是割,则数量为 \(\frac C4\)

\(\{e,f\}\) 为一组割当且仅当通过哈希加树上差分求割边时,\(e,f\) 哈希不为 \(0\) 且相同

容易做到 \(O(\sum(n+m\log m))\)

代码

参考

QOJ #8134. LCA Counting

\(k\) 的答案的上界显然为 \(2k-1\),当且仅当满足以下要求时成立:若非叶子结点 \(u\) 的子树内选择了叶子,则它至多有两个儿子的子树内选择了叶子

在此基础上,一个结点在两个儿子的基础上每额外增加一个儿子的子树中存在被选择的叶子,答案就要减 \(1\)

\(dp_u\) 表示不产生额外代价的情况下,子树 \(u\) 内选择儿子数量的最大值,根的 \(dp\)\(1\),非叶子结点的 \(dp\) 为其儿子的 \(dp\) 值中最大的两个之和(不足两个则取最大的)

考虑 \(k\) 增大的过程,初始被标注集合为空,每次可以选择一个点 \(u\) 满足 \(f_u\) 被标记但 \(u\) 没有被标记,并标记 \(u\)\(dp_u\) 对应结点,且这一步额外代价为 \(1\),接下来 \(dp_u-1\) 步不产生额外代价

一个比较方便的实现为每个结点记录可重集,叶结点集合为 \(\{1\}\),非叶子结点的集合取其儿子的集合之并,若存在不少于两个儿子,则取儿子集合的最大值中最大的两个,删去两者并加入两者之和,然后从大到小枚举根的集合中的值 \(x\),表示目前付出 \(1\) 的额外代价,接下来 \(x-1\) 次都没有额外代价

时间复杂度 \(O(n\log^2n)\)\(O(n\log n)\)

代码

参考

posted @ 2026-02-22 07:00  Hstry  阅读(0)  评论(0)    收藏  举报