2025年7&8月习题集

2025年7&8月习题集

  1. P4565 [CTSC2018] 暴力写挂。拆贡献、点分治、虚树。
  2. arc203_c。组合数。
  3. abc417_g。可持久化平衡树,复杂度分析。
  4. CF1519F。Hall 定理,状压 DP。
  5. P10800 「CZOI-R1」卡牌
  6. P4094 [HEOI2016/TJOI2016] 字符串

1. P4565 [CTSC2018] 暴力写挂

考虑将原式转化

\[d(x)+d(y)-d\Big(\text{LCA}(x,y))+d'\big(\text{LCA}'(x,y)\big)\Big) \]

\[\frac12\Big(d(x)+d(y)+(x,y)-2d'\big(\text{LCA}'(x,y)\big)\Big) \]

考虑对左树点分治,记一个点到分治重心的距离为 \(dep\),则一个点的权值为 \(d(x)+dep_x\)。然后考虑右树的贡献怎么办。

先把左树不同子树的点染不同颜色,当前连通块的点根据右树建虚树,那么把右树的贡献挂在 LCA 上,用 DP 找到子树内不同颜色的点的最大权值即可,只需记录两种不同颜色的最大权值即可转移。

复杂度 \(O(n\log^2 n)\)\(O(1)\) LCA 后瓶颈在建虚树时的排序,换成基数排序可以做到 \(O(n\log n)\)

2. arc203_c

首先 \(K<H+W\) 是容易的。我们只考虑 \(K=H+W\)

分两种情况:

  1. 最短路径长度为 \(H+W-2\)
    此时我们如果随便选两条边插入 \(K=H+W-2\) 的方案数里,多的情况只可能是出现如下图形:
    存在路径 \((i,j)\to(i,j+1)\to(i+1,j+1)\)\((i,j)\to (i+1,j)\to(i+1,j+1)\)
    如果已知这种图形在路径上的出现位置,方案数等同于从 \((1,1)\) 走到 \((H-1,W-1)\) 的方案数。枚举出现位置,所以减去的方案数为 \((H+W-3)\binom{H+W-4}{H-2}\)
  2. 最短路径长度为 \(H+W\)
    发现出现恰好一次形如「右上右」或「下左下」,我们以前者为例。假设没有其他限制,那么方案数为其他随便排的方案数减去特殊图形的位置,为 \(\binom{H+W-3}{H}(H+W-2)\)。排除特殊图形前有 \(H\) 个下的方案数与之后有 \(H\) 个下的方案数,因为此时会超出边界,方案数为 \(\sum_{i=0}^{m-3}\binom{n+i}i\),这个式子可以看做从 \((0,0)\to(n,i)\) 的方案数之和,即 \((0,0)\to(n+1,m-3)\) 的方案数,为 \(\binom{n+m-2}{m-3}\)

3. abc417_g

考虑可持久化 FHQ_Treap,每次把 \(L_i,R_i\) 的平衡树合并成 \(i\)。但我们发现如果随机赋权,因为期望树高是树大小的对数,而树大小每次翻倍,树高会每次加一。

考虑按照两棵树根节点的 \(sz\) 合并,以 \(\frac {sz_x}{sz_x+sz_y}\) 的概率把 \(x\) 作为根。注意如果 \(sz_x+sz_y>Inf\),那么要把 \(sz_y\) 右边截到 \(Inf\)

时间复杂度 \(O(n\log V)\),空间复杂度 \(O(n\log V)\)

4.CF1519F

对于一种上锁方案,如果上了 \(c_{i,j}\),则在左部点为箱子,右部点为锁的二分图中,左 \(i\)\(j\) 连一条边,则一组可行的方案要求满足:

对于任意的箱子集合 \(S\)

\[\sum _{i\in S} a_i\le \sum _{i\in N(S)} b_i \]

其中 \(N(S)\) 为集合 \(S\) 在二分图中的邻域点集。

发现这个条件有点像 Hall 定理,考虑把每个箱子拆成 \(a_i\) 个点,每把锁拆成 \(b_i\) 个点。我们发现,一个方案合法的条件就是,左部点存在完备匹配,考虑 DP。

\(f_{i,j_1,j_2,\dots,j_m}\) 表示考虑完左边 \(i\) 个箱子,右边第 \(i\) 把锁还有 \(j_{i}\) 个点没有被选,\(j\) 可以用五进制压起来。

做记忆化搜索,表面上复杂度是 \(O(n5^{2m})\),其实复杂度应该更低,因为一个状态可达要满足 \(\sum _{k\le i} a_k=(\sum b)-\sum j\)。所以飞快就跑完了。

5.P10800 「CZOI-R1」卡牌

相当于对于任意有序数对要满足 \(a\le a_i\Rightarrow b>b_i\),对于相同的数的对只要满足一个方向就行。

从大到小枚举 \(d\),那么 \(a,b,c\) 每次前缀多删一段,我们记录 \(va_i,vb_i,vc_i\) 表示第一次删掉的时间,那么选择一种 \(a,b,c\) 对答案的贡献则为 \(\min(va_i,vb_i,vc_i)\),这样 \(d\)\(a,b,c\) 的限制就考虑完了。

我们枚举这个 \(\min\) 值是谁,假设是 \(a\),那么对 \(b,c\) 有下界限制。我们枚举 \(a\) 的值,那么对 \(b,c\) 又有一个下界限制,与前面的下界限制拼起来。于是 \(a\)\(b,c\) 的限制就考虑完了,考虑 \(b\)\(c\) 的限制。

\(b\) 增大时,\(c\) 的下界会不断减小然后小于 \(a\)\(c\) 的下界,找到这个使 \(c\) 的下界小于 \(a\)\(c\) 的下界的 \(b\),前面的 \(b\) 的贡献可以预处理,后面的 \(b\) 的贡献都是 \(c\) 的下界。可以二分找到这个 \(b\),也可以当 \(a\) 变化时移动指针。

可以做到 \(O(n\log n)\)\(O(n)\)

6. P4094 [HEOI2016/TJOI2016] 字符串

水黑。每次询问子串 \([a,b]\) 中所有子串与子串 \([c,d]\) 的 LCP 的最大值。

考虑二分答案,那么对于答案 \(mid\),子串左端点可以取到 \([a,b-mid+1]\) 范围内。

对原串建 SA,然后找到 \([a,b-mid+1]\) 内最大的小于后缀 \(c\) 的后缀,找到最小的大于后缀 \(c\) 的后缀。

那么对原串按顺序建主席树即可,复杂度 \(O(n\log ^2n)\)

posted @ 2025-08-24 22:08  dengchengyu  阅读(6)  评论(0)    收藏  举报