2025年4&5月杂题集

2025年4&5月杂题集

目录

  1. P6780 [Ynoi2009] pmrllcsrms([EC Final 2021] Vacation)
    黑、线段树、分块。
  2. P4208 [JSOI2008] 最小生成树计数
    紫、暴力。
  3. P3199 [HNOI2009] 最小圈
    紫、分数规划、SPFA 判负环。
  4. P2178 [NOI2015] 品酒大会
    紫、后缀数组、并查集。
  5. P3426 [POI 2005] SZA-Template
    紫、KMP、失配树、链表。
  6. P3649 [APIO2014] 回文串
    紫、Manacher、后缀数组。
  7. P4287 [SHOI2011] 双倍回文
    紫、Manacher、字符串哈希。
  8. P10141 [USACO24JAN] Merging Cells P
    紫、区间 DP、前缀和优化。
  9. P9318 [EGOI 2022] Lego Wall / 乐高墙
    紫、阈值分治、组合数学、DP。
  10. P4478 [BJWC2018] 上学路线
    紫、DP、Lucas 定理、CRT。
  11. P4827 [集训队互测 2011] Crash 的文明世界
    黑、DP、斯特林数。
  12. P4774 [NOI2018] 屠龙勇士
    紫、同余方程、中国剩余定理。
  13. P5979 [PA 2014] Druzyny
    黑、DP、CDQ 分治,线段树。
  14. P5311 [Ynoi2011] 成都七中
    黑、点分树、性质、扫描线。
  15. P2120 [ZJOI2007] 仓库建设
    紫、斜率优化、单调队列。
  16. P6109 [Ynoi2009] rprmq1
    黑、猫树分治、区间历史最值。
  17. P7963 [NOIP2021] 棋局
    黑、线段树合并、并查集、时间倒流。
  18. P9530 [JOISC 2022] 鱼 2
    黑、线段树、值域分析。
  19. P3688 [ZJOI2017] 树状数组
    紫、分析代码、树套树。
  20. P5102 [JOI 2016 Final] 领地 / Territory
    黑、区间交与并。

1. P6780 [Ynoi2009] pmrllcsrms([EC Final 2021] Vacation)

求区间内长度不超过 C 的最大子段和,带单点修改。

对于单个块内是可以任意取的,需要对每个块开一个维护最大子段和的线段树。

而对于任意相邻两个块,可以选择左块的后缀 \(i\) 与右块的前缀 \(j\) 满足 \(j<i\)\(i,j\) 是块内的编号)相加。于是每相邻的块开一个线段树,下标为块内的编号,需要维护区间最大的左块后缀和与右块前缀和,以及区间内最大合并出的答案,这些信息是可以直接加懒标记的。

查询时先查整块之间的贡献,对于散块则要讨论一下。

则有三种线段树:每个块的最大子段和线段树,每相邻块的线段树,支持单点修改的区间最值线段树(用于查询一段整块的贡献,这里有两棵)。

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

2. P4208 [JSOI2008] 最小生成树计数

给出边,对最小生成树计数。

考虑 Kruskal 的思想,无论如何连,将小于等于某边权的边连上后,形成的连通块是一定的,从而每种边权的边数是一定的。

于是对每种边权分别计数,将方案数相乘就是答案。那么由于相同边权的边不超过 \(10\) 条,于是 \(2^{10}\) 暴力做即可。

复杂度粗略是 \(O(m2^{10})\)

3. P3199 [HNOI2009] 最小圈

给一个图,求边权均值最小的环,求出均值。

分数规划,考虑二分答案 \(ans\),设环长为 \(k\)

\[\frac 1k\sum_{i=1}^k w_i>ans \]

\[\sum_i (w_i-ans)>0 \]

于是 check 就是判断是否有负环,用 SPFA 即可。

即当 \(dis_v=dis_u+w\) 时,令 \(times_v=times_u+1\),判断是否有 \(times>n\),此时最短路点数大于 \(n\)

复杂度 \(O(nm\log V)\)

4. P2178 [NOI2015] 品酒大会

\(1\sim n\) 的每一个 \(k\)\(lcp(i,j)=k\)\((i,j)\) 对数量,并求其中 \(a_i\times a_j\) 的最大值。

考虑后缀数组,\(lcp(i,j)=k\)\(\min(hei_{i+1},\dots,hei_{j})=k\),所以 \(k\) 相似的酒在 \(sa\) 上形如若干段区间。

考虑倒序做,求完 \(k+1\) 相似的区间后,求 \(k\) 相似。插入 \(hei=k\) 的位置时,用并查集合并左右两个区间,同时更新答案。

复杂度 \(O(n\log n)\),瓶颈在于求后缀数组。

5. P3426 [POI 2005] SZA-Template

求一个串使其可以通过出现若干次(允许重叠)变成原串,求其最小长度。

首先其一定是原串的 Border,于是考虑失配树上从 \(n\)\(1\) 路径的每一个点,再考虑其合法的条件,就是原串中每一个出现位置的距离不超过其长度。

那么对于每一个考虑的点,因为子树内的点一定包含自己(否则不),将子树内所有点加入数据结构,看最大相邻差值是否不超过长度。

可以从 \(1\) 号点往 \(n\) 号点走,每次把无关子树内的点从链表中删去,维护相邻最大值即可。

复杂度 \(O(n)\)

6. P3649 [APIO2014] 回文串

求所有回文子串的出现次数乘长度的和。

由 Manacher,本质不同回文子串的个数是 \(O(n)\) 的,对于每个子串,在 SA 上往左右二分即可求出出现次数。

复杂度 \(O(n\log n)\)

7. P4287 [SHOI2011] 双倍回文

求形如 \(ww^Rww^R\) 的最长子串,其中 \(w^R\)\(w\) 的逆序。

显然 \(ww^Rww^R\) 是回文子串,于是枚举所有 \(O(n)\) 种回文子串判断是否合法即可。

判断合法就是首先拆成两段相同的,用字符串哈希比较相等,然后分别判断两段是否回文。

8. P10141 [USACO24JAN] Merging Cells P

序列上随机大鱼吃小鱼,求 \(i\) 获胜的概率。

原问题可以看做从 \([1,n]\) 这样一个大细胞,每次随机选择一个位置将当前区间分成左右两侧,然后选择获胜者。

\(f_{l,r}(l\le r)\) 表示获胜者在 \([l,r]\) 中的概率,转移是容易的。

使用前缀和优化就可做到 \(O(n^2)\)

9. P9318 [EGOI 2022] Lego Wall / 乐高墙

有两种 DP。

第一种:设 \(f_{i,j}\) 表示前 \(i\) 列有 \(j\) 个凸出到了第 \(i+1\) 列的方案数。

\[f_{i,j}=\sum _{k=1}^{m-1} f_{i-1,k}\times \binom {m-k} j \]

复杂度 \(O(nm^2)\)

第二种:设 \(f_i\) 表示长 \(n\)\(m\) 的乐高墙合法的方案数,考虑用总数减去不合法的方案数。

对于长 \(n\)\(m\) 的乐高墙,每一行是独立的即 \(feb_i=feb_{i-1}+feb_{i-2}\)。于是总数为 \(g_n=feb_{n}^m\)

减去不合法的方案数考虑枚举第一个断开的列,后面的列可以任意选,于是

\[f_i=g_i-\sum_{j=1}^{i-1} f_{j}\times g_{i-j} \]

复杂度 \(O(n^2)\)

平衡即可做到 \(O(nm^{\frac43})\)

10. P4478 [BJWC2018] 上学路线

排序以后,设 \(f_{i}\) 表示走到 \(x_i,y_i\) 且此前没有走到过关键点的方案数。

那么用总方案减去不合法的方案数,枚举此前第一个走到的关键点,剩下的可以随便走。则

\[f_i=\binom{X+Y}X-\sum_{j=1}^{i-1} f_{j}\times\binom{X-x_j+Y-y_j}{X-x_j} \]

使用 Lucas 定理快速求组合数。对于 P 不为质数的情况,用 CRT 合并即可。

11. P4827 [集训队互测 2011] Crash 的文明世界

给一棵树,对每个点 \(i\)\(\sum dis(i,j)^k\)

\[\begin{aligned} \sum_{i=1}^n dis(x,i)^k &= \sum_{i=1}^n\sum_{j=0}^kstr2(k,j)\binom{dis(x,i)} {j}j!\\ &=\sum_{j=0}^kstr2(k,j)j!\sum_{i=1}^n\binom {dis(x,i)} j\\ &=\sum_{j=0}^kstr2(k,j)j!\sum_{i=1}^n\binom {dis(x,i)-1} {j-1}\binom {dis(x,i)-1} j \end{aligned} \]

\(f_{x,j}\) 表示子树内 \(\sum\binom{dis(x,i)}{j}\)

则有 \(f_{x,j}=\sum_{son} f_{son,j}+f_{son,j-1}\)

然后再做换根 DP 即可。

12. P4774 [NOI2018] 屠龙勇士

首先每一轮用的剑 \(c_i\) 是确定的,这可以用一个 set 维护。

然后假设 \(a_i\le p_i\),则一轮一定要使血量小于等于 \(0\),于是攻击次数 \(x\) 要满足 \(xc_i\equiv a_i\pmod {p_i}\)

这很像 CRT 的形式,但又不完全是。

\[xc_i\equiv a_i\pmod {p_i} \]

等价于存在一个 \(k\) 使得。

\[xc_i+kp_i=a_i \]

如果我们解出一组特解 \(x',k'\),则有 \(x\) 的通解公式如下

\[x=x'+n\frac {p_i} {(p_i,c_i)} \]

\[x\equiv x'\pmod {\frac {p_i}{(p_i,c_i)}} \]

然后用扩展中国剩余定理求解 \(x\) 即可。

Corner Case:

对于存在 \(a_i>p_i\) 的情况,观察数据范围,此时 \(p_i=1\),于是答案即 \(\max\{\lfloor\frac {a_i}{c_i}\rfloor\}\)

对于所有 \(a_i=p_i\) 的情况,答案即血量的 \(LCM\)

13. P5979 [PA 2014] Druzyny

\(f_i\) 为以 \(i\) 为一组的结尾时分到的组数的最大值。

考虑 CDQ 分治。对于分治区间 \([L,R]\),已经求出了 \([L,M]\)\(f_i\) 的值,现在用这些值更新 \([M+1,R]\)\(f_i\) 的值。

\(\min_x\) 表示 \(\min_{x\le i\le M}d_i\)\(max_x\) 表示 \(\max_{x\le i\le M} c_i\),对于右侧区间同理。

那么 \(i\) 能转移到 \(j\) 需要满足两个条件:

\(\max_{i+1}\le j-i\le\min_{i+1}\)
\(\max_{j}\le j-i\le \min_j\)

则有:

\(\max_{i+1}+i\le j\le \min_{i+1}+i\)
\(j-\min_j\le i\le j-\max_j\)

考虑对 \(i\) 差分,在 \(\max_{i+1}+i\) 在线段树上插入 \(i\) 信息,在 \(\min_{i+1}+i+1\) 删除 \(i\) 的信息。
然后枚举 \(j\),更新对应的 \(i\) 信息,查询 \(j\) 限制下的线段树信息。

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

14. P5311 [Ynoi2011] 成都七中

给一棵树,每次询问把 \([l,r]\) 的点保留,问 \(x\) 所在连通块的大小。

考虑建出点分树,把询问挂在子树上从而减小复杂度。

\([l,r]\) 中存在一个点 \(p\) 使得 \(p\) 在点分树上的子树内,包含 \(x\) 连通块中的所有点。

且这个点 \(p\) 就是点分树上 \(x\) 到根的路径上,可达 \(x\) 的最浅点。

为什么是对的?因为如果 \(y,z\) 都可被 \(x\) 达,则 \(y,z\) 在点分树上的公共祖先也可被 \(x\) 达,这是点分树的性质。所以不存在两个可达点 \(y,z\) 使得它们在点分树上的公共祖先不可达,于是就存在最浅点 \(p\)

找到 \(p\) 后,子树内点 \(q\) 合法就是要满足 \(p,q\) 路径上的最小最大编号在 \([l,r]\) 范围内。

这是一个二维偏序问题,将 \(q\) 放到平面内 \((\min,\max)\) 的位置,\(\min,\max\) 表示路径上最小最大编号,询问用扫描线求即可。

复杂度 \(O(n\log ^2n)\),瓶颈在把点分树上每个子树的每个点用 \(O(\log n)\) 的复杂度插入数据结构。

15. P2120 [ZJOI2007] 仓库建设

斜率优化模板题。

\(f_i\) 表示启用 \(i\) 仓库,此前所有仓库的产品都运输好了的费用。

\(a_i=\sum _{j\le i} (x_{n}-x_{j})p_j\)\(b_i=\sum _{j\le i} p_j\)

\(f_i=c_i+\min\{f_j+a_i-a_j-(b_i-b_j)(x_n-x_i)\}\)

\(d=x_n-x_i\),则 \(f_i-c_i-a_i+db_i=f_j-a_j+db_j\)

\(b=y-kx\) 中,设 \(b=f_i-c_i-a_i+db_i,y=f_j-a_j,k=-d,x=b_j\)

看出 \(x\) 是单调的,用单调队列做斜率优化即可做到 \(O(n)\)

16. P6109 [Ynoi2009] rprmq1

如果查询中 \(l_1=1\),则把修改差分变成从 \(l_1\) 的区间加与 \(r_1+1\) 的区间减,询问 \(r_1\) 时的区间历史最值即可。

如果去掉限制,考虑猫树分治,对于查询 \((l_1,r_1,l_2,r_2)\),把 \((l_1,r_1)\) 挂在线段树上第一次由 \(mid\)\((l_1,r_1)\) 分开的节点,然后对于每个节点从 \(mid\) 开始往左右分别做修改,查询往左到 \(l_1\) 和往右到 \(r_1\) 时刻的区间历史最值。

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

17. P7963 [NOIP2021] 棋局

考虑时间倒流,则每次会合并一个点与周围的连通块。

首先考虑 3 号边,那么需要维护连通的点以及相邻的黑点和白点,合并时采用线段树合并。我们对关键点按等级与时间排序,这样查询时查一个前缀即可。

然后是 2 号边,我们对行与列分别维护并查集,求出往四个方向走到的位置,然后需要减去与 3 号边重复的部分,所以 3 号边部分求连通块的线段树需要维护按行顺序和列顺序排列的两棵树,这样去重时查询区间和即可。

对于 1 号边,枚举四个点,同时去重即可。

复杂度 \(O(n\log n)\)

18. P9530 [JOISC 2022] 鱼 2

我们选出一段序列 \([L,R]\),用 \([l,r]\) 表示每一条鱼最多能吃掉这个范围内的所有鱼。

由于有修改,考虑线段树上合并两段序列,维护每条鱼的 \([l,r]\) 变化情况。显然只有三种 \([l,r]\) 是有用的,\(l=L\)\(r=R\)\([l,r]=[L,R]\)

而我们发现对于一个端点相同的 \([l,r]\) 另一个端点最多只有 \(O(\log A)\) 种,这是因为每个端点 \(x\) 一定满足 \(a_{x+1}\) 大于此前所有数的和,于是每个端点都会至少乘 \(2\),于是只需要记录每种端点与出现次数即可表示所有有用的 \([l,r]\) 以及能到达整个序列的次数。

然后考虑如何合并两段序列 \([L,mid][mid+1,R]\)。对于左侧只能达 \(L\) 的显然合并后依然只能达 \(L\),右侧同理。

然后考虑左侧只能达 \(mid\) 的,我们按 \(l\) 从大往小,扩展每个区间,这样每次扩展后的区间一定不减小,同时我们发现扩展后的区间 \([l',r']\) 一定满足 \(l'\in lson_r,r'\in (rson_l\cup mid)\),其中 \(lson_r\) 表示左侧只能达 \(mid\) 的区间,\(rson_l\) 表示右侧只能达 \(mid+1\) 的区间,所以扩展的复杂度是 \(O(\log A \log n)\) 的,\(O(\log n)\) 为用树状数组查区间和的复杂度。对于右侧同理。

最终复杂度 \(O(n\log ^2n\log A)\)

19. P3688 [ZJOI2017] 树状数组

首先可以发现 ADDFIND 的作用是查询后缀和,然后因为加减法是等价的,所以 QUERY 求的就是 \([l-1,r-1]\) 的和。

现在问你 \([l-1,r-1]\)\([l,r]\) 的和相等的概率,就是问 \(l-1,r\) 相等的概率,我们记 \(a=l-1,b=r\)

对于修改 \([L,R]\),有三种情况会对特定的 \(a,b\) 对造成贡献,设 \(p=(R-L+1)^{-1}\),则:

  • \(a<L\le b\le R\),有 \(p\) 的概率会改变。
  • \(L\le a\le R<b\),有 \(p\) 的概率会改变。
  • \(L\le a\le b\le R\),有 \(2p\) 的概率会改变。

这里的改变指由相同变为不同,或由不同变为相同。

于是用这是一个矩形加,单点查问题,使用二维线段树解决。

关于懒标记部分:假设一个对不同的概率为 \(p\),现在有 \(q\) 的概率改变,则 \(p\gets p(1-q)+(1-p)q\),懒标记的合并也是这样。

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

20. P5102 [JOI 2016 Final] 领地 / Territory

假设第一轮移动的向量为 \((dx,dy)\),假设 \(dx>0\)

则我们把到达的一个位置 \((x,y,t)\),记为 \((x+t\times dx,y+t\times dy)\),要求 \(x\in [0,dx)\)

这样我们暴力走一轮,走到 \((x,y,t)\)(这里 \(t\) 不一定等于 \(0\),可能大于或小于 \(0\)),则总共走到的位置就是 \((x,y,t),(x,y,t+1),\dots,(x,y,t+k-1)\)

相当于在 \((x,y)\) 并一个区间 \([t,t+k-1]\)

那么枚举 \(2\times 2\) 方格的左上角,然后四个位置区间交的大小即可。当 \(x=dx-1\) 时要特判,因为再往右走 \(t\) 会加 \(1\)

Corner Case:

  • \(dx=0,dy\ne 0\),把两者交换,交换操作序列。
  • \(dx<0\),把 \(E,W\) 交换即可。
  • \(dx=dy=0\),走一轮即可。

复杂度 \(O(n\log n)\),因为求交和并的过程要排序。

posted @ 2025-05-29 22:10  dengchengyu  阅读(21)  评论(0)    收藏  举报