做题记录

做题记录

九日把我以前写的弄丢了,呜呜呜。

冬之花(hana)

题意:有一条长为 \(n\) 的链,每个节点都与源点和汇点有连边,边有权值,而且有多次对边权的修改,每次修改后询问最大流。 $ n\le 5 \times 10^5 $

根据最大流最小割定理,每次修改后的最小割就是答案。一个经典trick,平面图转对偶图,就是把平面图分割成的多个面看成新点,有边相邻的面之间连边,发现原图的最小割就是对偶图的最短路,由于本题对偶图是一个宽为2的网格图,所以DP即可。容易发现转移满足结合律(也可以写成矩阵),用线段树之类的数据结构维护。

取得(ak)

题意:在一个 $ N \times M $ 的网格图中求一个初始斜率非负的下凸壳(要求斜率严格单调递增)最多的整点数。 $ N,M \le 3000 $

首先原问题等价于选择若干条斜率不同的向量,使得首尾相接不超出网格图且整点数最多,因为可以按斜率排序,同时一条横坐标长 \(x\) ,纵坐标长 \(y\) 的向量,如果 $ \gcd(x,y) \neq 1 $ ,那么选择它一定不优,判掉就行 。这是一个二维背包问题,复杂度 $ O(N^4) $ ,难以通过。

进行一些神秘的优化。首先注意到一个向量 $ (x,y) $ 在答案中的一个必要条件是 $ \forall i \le x , j \le y $ , $ (i,j) $ 在答案中,那么可能在答案中的向量(根据JJDW的证明)只有 $ O( N^{ \frac{2}{3} } ) $ 个,这样复杂度降到了 $ O( N^{ \frac{8}{3} } ) $ ,还不能通过。考虑到另外一个结论: $ N \times N $ 的网格图中凸包的整点个数为 $ O( N^{ \frac{2}{3} } ) $ ,(或者打表发现最终答案很小),状态数比较少,可以进行一次交换定义域值域,复杂度降到了 $ O( N^{ \frac{7}{3} } ) $ 。

P5972 Desant

模板CCX,模拟赛多次考到。

在暴力的基础上压缩状态,假设我们决策到第 \(k\) 位,那么对于第 $ k+1 $ 到第 \(n\) 位排序后形成的一个序列,把当前已经选择的数划分为若干连续段,容易发现,以后的贡献只与每一段的大小有关,我们并不关注具体选了哪些数,压缩一下即可。

复杂度分析:考虑有多少状态数,一个状态大小为各连续段的乘积,根据均值不等式,所有连续段取相同值最大。设每一段大小都为 \(x\) ,那么最大状态为 $ x^{ \frac{n}{x} } $ ,求它的最值,将其变为 $ \ln x^{ \frac{1}{x} } = \frac{1}{x} \ln x $ ,不影响单调性。求导一下得到:

\[( \frac{1}{x} \ln x )' = \frac{ 1 - \ln x }{ x^2 } \]

上式在 $ x=e $ 时值为零,因此 $ x^{ \frac{n}{x} } $ 在 $ x<e $ 时递增,在 $ x>e $ 时递减,在 $ x=e $ 时取最大值。

由于 \(x\) 为整数,所以算上转移复杂度为 $ O( 3^{ \frac{n}{3} } n^2 ) $

reward

模板wqs二分。场上被创飞了。

传统wqs二分是这样的:假设有一个凸函数 $ f(x) $ ,我们想要求它在 \(n\) 处的值,假设有一个一次函数满足 $ f(x) = kx+b $ ,有 $ b = f(x) - kx $ ,二分斜率 \(k\) ,求在何处取极值。

由于上述做法有很多细节并且不能扩展到高维,学习一下优秀的严格wqs二分。

设 $ g(x) = \max_a { f(a) + a x } + n x $ ,根据拉格朗日对偶相关理论 (我不会), $ g(x) $ 也是一个凸函数,若 $ f(x) $ 是上凸函数,那么 $ g(x) $ 是下凸函数,且最小值为 $ f(n) $ 。现在问题变成求一个凸函数的最小值。

P11714 主旋律

题意:给定一个 \(n\) 个节点, \(m\) 条边的有向图,求有多少边的子集删去之后整个图仍然强联通,保证没有重边和自环。 $ n \le 15 $

由于强连通很难刻画,我们转化到非强连通。

先考虑一个弱化问题:求有向图的DAG子图数目。

注意到DAG中有一些入度为零的节点,删除它们后的图仍然是DAG,于是我们可以得到一个子结构。

设 $ f_S $ 为 \(S\) 点集是一个DAG的方案数,设 $ E_{S,T} $ 为 \(S\)\(T\) 的边数,有一个FAKE的转移方程:

\[f_S = \sum_{ T \subset S } f_T \times 2^{ E_{S-T,T} } \]

错误在于没有保证 \(S-T\) 是DAG \(S\) 中恰好所有入度为零的节点。考虑子集反演。

假设当前全集为 \(S\) ,设 $ g_T $ 为入度为零的节点集合恰好为 \(T\) 的方案数, $ h_T $ 为钦定 \(T\) 集合节点入度为零的方案数。有

\[f_S = \sum_{ T \subseteq S , T \neq \varnothing } g_{T} \]

\[h_T = \sum_{ T \subseteq R } g_R = f_{S-T} \times 2^{ E_{T,S-T} } \]

\[g_R = \sum_{ R \subseteq T } (-1)^{ |T| - |R| } h_T \]

简单推一下式子:

\[f_S = \sum_{ T \subseteq S , T \neq \varnothing } g_{T} \]

\[f_S = \sum_{ T \subseteq S , T \neq \varnothing } \sum_{ T \subseteq R } (-1)^{ |R| - |T| } h_R \]

\[f_S = \sum_{ T \subseteq S , T \neq \varnothing } (-1)^{|T|} h_T \sum_{ R \subseteq T , R \neq \varnothing } (-1)^{|R|} \]

\[f_S = \sum_{ T \subseteq S , T \neq \varnothing } (-1)^{ |T|+1 } h_T \]

\[f_S = \sum_{ T \subseteq S , T \neq \varnothing } (-1)^{ |T|+1 } f_{S-T} \times 2^{ E_{T,S-T} } \]

至此,我们已经有了快速计算DAG子图方案数的做法。

将上述做法迁移到非强连通分量。设 $ f_S $ 为 \(S\) 缩成一个点的方案数,设 $ g_S $ 为 \(S\) 缩成几个入度为零的点的方案数。考虑容斥转移。

\[f_S = 2^{ E_{S,S} } - \sum_{ T \subseteq S , T \neq \varnothing } (-1)^? g_T \times 2^{ E_{T,S-T} + E_{S-T,S-T} } \]

其中容斥系数与 \(T\) 缩成的点数有关,很不好做。充分发扬人类智慧,令 $ g_S $ 为缩成奇数个点的方案数减去偶数个点的方案数。得到一个FAKE转移:

\[f_S = 2^{ E_{S,S} } - \sum_{ T \subseteq S , T \neq \varnothing } g_T \times 2^{ E_{T,S-T} + E_{S-T,S-T} } \]

为什么说这个转移FAKE呢?注意到当 $ S=T $ 时, $ g_T $ 中包含 $ f_S $ 的所有方案,我们将它减去是不正确的,在后面会有这个问题的巧妙解决。

先来考虑一下 $ g_S $ 怎么求。在原来缩点的基础上再加一个入度为零的点,为避免重复情况,钦定编号最小的节点所在的强连通分量是最后加入的。

\[g_S = f_S - \sum_{ T \subset S , lowbit(S) = lowbit(T) } f_T \times g_{S-T} \]

这里又有问题了,似乎 $ f_S $ 和 $ g_S $ 是相互依赖的。我们结合提到的上一个问题,在计算 $ f_S $ 时, $ g_S $ 不应该包含 $ f_S $ 的方案,所以有这样的转移顺序:先求出 $ g_S $ ,但是不包含 $ f_S $ ,代入计算 $ f_S $ ,最后再给 $ g_S $ 加上 $ f_S $ 。

对于 $ E_{S,T} $ 需要精细实现一下,可以做到 $ O(3^n \ n ) $

哨塔(tower)

强烈推荐好题。

给定一个 \(n\) 节点的树,边权为一,从中选择恰好 \(m\) 个点作为关键点,最大化到所有关键点最远距离不超过 \(d\) 的节点数(下文称为选择点)。$ n\le 2\times 10^6 $

有这样一个结论:首先注意到关键点和选择点都形成连通块,枚举关键点连通块的中心,将所有关键点围绕中心放置,使得连通块直径尽可能小,可以证明这样一定是最优的。

那么有这样一个 $ O(n^2) $ 的暴力:枚举中心,以中心为树根,将关键点放置在深度最小的位置。这时候我们发现这么一个问题:可能我们不能恰好铺满最后一层,多余的关键点怎么做。赛时的想法是,枚举这些多余关键点全都放在中心的哪个儿子。如果这个儿子子树的下一层仍然会余下关键点,那么全部多余必然会放在至少两个儿子中,具体是哪两个并不重要(对结果没有影响,很显然);否则,统计答案即可。

以下是正解。

仍然沿用上述暴力的思路。我们发现枚举多余节点放在哪个子树很不好处理,考虑发扬人类智慧:我们在每条边上挂一个虚点,定义虚点权值为零,可以作为中心,那么对于不满一层的节点直接当做满一层,容易发现这样完美地解决了问题。

剩下的部分很容易想到换根,再用数据结构优化。

求某一中心的直径是很好换根的,现在复杂度瓶颈在于求以某一节点为根,不超过某一深度的节点个数。

这里使用长链剖分。设 $ f_u $ 为DFS序为 \(u\) 的节点到所在长链的链顶这一段连续的深度中,被包含于链顶所在子树的节点个数。(很抽象,是不是?)先预处理一遍,记录重儿子和DFS序,将轻儿子的信息合并到长链的DFS序上,最后再对每一条长链的DFS序做一遍前缀和。

换根的话有点复杂,已知 $ f_u $ 维护当前根节点字数内信息,设 $ g_i $ 为子树外到当前根距离不超过 \(i\) 的节点数, $ g_i $ 的转移需要数组整体位移,打个标记就好。如果当前转移到轻儿子,将处该儿子的子树信息合并到 \(g\) 即可;否则,需要先除去其他轻儿子的贡献,由于 $ f,g $ 都是前缀和的形式,为保证复杂度,不能修改整条长链,打懒标记 $ tf,tg $ 分别维护 \(f,g\) 。实现细节比较多。

复杂度为 $ O(n) $ 。

编辑(edit)

给定长度为 \(n,m\) 的字符串 $ S,T $ ,字符集大小为26,支持每次对 \(S\) 中的一种字符删去开头或最后的一个,删除有代价。问使 \(S\) 变成 \(T\) 的最小代价,或者报告无解。$ n,m \le 2 \times 10^5 $ 。

暴力又是显然的,设 $ f_{i,j} $ 为 \(S\) 的前 \(i\) 位匹配 \(T\) 的前 \(j\) 位最小代价。

动态维护一个关于 \(S\) 的字符串 \(R\) ,初始时为空。扫描 \(T\) 串,若当前字符在 \(T\) 中第一次出现,就把 \(S\) 中的该字符都插入 \(R\) ;若这是最后一次出现,就把 \(R\) 中该字符都删除。然后注意到 \(T\) 中不含起始和结尾字符的一个子串必然匹配 \(R\) 的一个子串,哈希匹配即可。复杂度 $ O(nV) $

自卑(inferiority)

拼尽全力,无法战胜,自卑了。

题意:长度为 \(N\) 的序列 \(a\) ,有 \(M\) 次询问,每次查询区间 $ [l,r] $ ,求 $ \sum_{ i \in [l,r] } \sum_{ j \in [l,r] } ( [ 2 a_i < a_j ] ( a_i \oplus a_j ) ) $ 。$ N,M \le 1 \times 10^5 $

空间 $ 64MB $ ,时间 $ 8s $ 。

模板莫队二次离线。(后面不想写了)。

CF1442F

超级神秘构造。

大概就是将所有点划分为集合 $ S_1,S_2 $ ,$ S_1 $ 内部形成完全DAG, $ S_2 $ 连自环 ,$ S_2 $ 向 $ S_1 $ 连边,使得每个 $ S_2 $ 中的点对应的 $ S_1 $ 集合两两不同,每次查询 $ S_1 $ 内的单点。

有如下结论:

  1. 若当前节点 \(u\) 为先手必胜,那么 \(x\) 在 $ S_2 $ 中且 \(x\) 不连向 \(u\)

  2. 若当前节点 \(u\) 为先手必败,那么 \(x\) 就是 \(u\)

  3. 若当前节点 \(u\) 为平局,那么 \(x\) 在 $ S_2 $ 中且 \(x\) 连向 \(u\)

容易发现把上述询问压成状态就可以唯一地确定答案,精细化实现即可AC。

posted @ 2025-07-09 21:28  Abnormal123  阅读(24)  评论(0)    收藏  举报