2025.10 做题记录
qwq awa owo uwu xwx
洛谷P6620 [省选联考 2020 A 卷] 组合数问题
纯式子。
CF1278F Cards
记 \(p=\frac{1}{m}\)。
然后直接做就完了。
洛谷P6031 CF1278F Cards 加强版
对 \(i^k=\sum\limits_{j=0}^{i}\binom{i}{j}{k\brace j}j!\) 这个式子二项式反演,可以得到
可以发现前面几项都是很好做的,\(j^k\) 可以线性筛出来,\(\binom{n}{j}\) 可以拆成下降幂除阶乘的形式,现在就后面的难做。
记 \(f(i)=\sum\limits_{j=0}^{k-i}\binom{n-i}{j}(-p)^j\)。
对于中间那个组合数,可以根据 \(\binom{n}{m}=\frac{n}{m}\binom{n-1}{m-1}\) 递推一下,也就是 \(\binom{n-i-1}{k-i}=\frac{n-i-1}{k-i}\binom{n-(i+1)-1}{k-(i+1)}\)。
对于右边那个式子,可以化成 \(\sum\limits_{j=0}^{k-(i+1)}\binom{n-(i+1)}{j}(-p)^{j+1}\),也就是 \((-p)f(i+1)\)。
边界为 \(f(k)=1\)。
然后就能 \(O(k)\) 做了。
洛谷P11343 [KTSC 2023 R1] 出租车旅行
考虑一条换乘路径 \(p_1,p_2,\cdots,p_{k-1},p_k\),显然有 \(\forall i\in [1,k-2],B_{p_i}>B_{p_{i+1}}\),也就是除终点外的 \(B\) 单调递减。
因为递减这个性质是不把终点算进去的,所以可以让全程的 \(B\) 都递减,最后再统计一遍答案。
记 \(f_i\) 表示走到 \(i\),且全程的 \(B\) 单调递减的最小费用。转移是很好想的:
\(f_i=\min\limits_{B_j>B_i}\{f_j+A_j+B_j\times dis(i,j)\}\)
可以感知到这个玩意是个一次函数状物,但是 \(dis(i,j)\) 是一个比较难处理的东西,因此拉到点分树上,\(dis(i,j)\) 就是 \(dis(i,s)+dis(j,s)\),\(s\) 为当前重心,就能用李超树做了。
把点按 \(B\) 从大到小排序,每次枚举祖先把 \(f_i\) 搞出来,然后在它祖先的李超树上都插个一次函数进去,统计答案和查询 \(f_i\) 是一样的。
洛谷P6881 [JOI 2020 Final] 火灾 / Fire
这个玩意瞪着看很难看出啥,可以打个表:
8 8 8 8 8 8 8
8 8 8 8 8 8 8
8 8 8 8 8 8 6
8 8 8 8 8 6 6
8 8 8 8 6 6 4
8 8 8 6 6 4 4
8 8 6 6 4 4 2
8 1 6 3 4 2 1
最下面是时刻为 \(0\) 的样子,最上面是时刻为 \(n\) 的样子。
可以发现每个位置的贡献都是一个平行四边形,不过可能只有一部分在这个正方形里。可以把平行四边形差分成三个边长无限的三角形,查询差分成一行的前缀和。平行四边形的大小和这个位置左边第一个大于等于它的位置、这个位置右边第一个大于它的位置有关。
然后就不难了。把查询和三角形都按照顶点的 \(x\) 从小到大排序。维护在这个查询左边和不在这个查询左边的三角形,把式子拆一下后用四个树状数组简单维护就行。
洛谷P8867 [NOIP2022] 建造军营
简单题。
可以发现割掉一个边双里的边是没用的,所以可以缩成几个边双,\(a_i\) 表示第 \(i\) 个边双的点数,\(b_i\) 表示第 \(i\) 个边双的边数。
缩完点后有个很好的东西,就是图变成了一棵树。对于两个被选上的点,它们路径上的边都是要选上的,不然就爆炸了。
考虑对这个玩意树形 dp。记 \(f_i\) 表示只有 \(i\) 子树里的点和边会选,至少选一个点,而且选的点连上 \(i\) 的方案数,\(g_i\) 表示 \(i\) 子树里一个点都不选(边可能会选)的方案。
转移:
\(f_u=f_u\times f_v+f_u\times g_v\times 2+g_u\times f_v\)。第一项表示 \(u\) 和 \(v\) 都选,那么 \((u,v)\) 必须选。第二项表示 \(u\) 选 \(v\) 不选,那么 \((u,v)\) 选不选都行。第三项表示 \(u\) 还没选,\(v\) 选,那么 \((u,v)\) 必须选。
\(g_u=g_u\times g_v\times 2\)。\(u\) 和 \(v\) 的子树里都不选,\((u,v)\) 随便。
初始化为 \(g_u=2^{b_u},f_u=2^{a_u+b_u}-2^{b_u}\)。
统计答案是简单的,\(ans=\sum\limits_{u=1}^{n}f_u\times 2^{c_u}\),其中 \(c_u\) 表示不在 \(u\) 子树里,也不是 \(u\) 和它父亲连的边的边数。
洛谷P11292 【MX-S6-T4】「KDOI-11」彩灯晚会
厉害。
合法链表示长度为 \(l\) 的链。
考虑 \(\sum cnt^2\) 的组合意义,也就是选出两条长度为 \(l\) 的合法链的方案数。
对于两条合法链,它们颜色相同的方案数 \(k^{n-2l+c+1}\),其中 \(c\) 表示这两个链重叠的点的个数。可以发现答案只和 \(c\) 有关,所以可以计算恰好重叠了 \(c\) 次的链的方案数,记为 \(f_c\)。
恰好重叠 \(c\) 次看起来就比较难算,可以容斥一下,算至少重叠 \(c\) 次的方案,记为 \(g_c\)。不难得出 \(g_i=\sum\limits_{j=i}^{k}\binom{j}{i}f_j\),二项式反演一下变成 \(f_i=\sum\limits_{j=i}^{k}(-1)^{j-i}\binom{j}{i}g_j\)。
在拓扑序上 dp。用 \(f_{u,v,k}\) 表示从 \(u\) 走到 \(v\),链长度为 \(k\) 的方案,\(dp_{u,l1,l2,k}\) 表示现在走到 \(u\),链一长度为 \(l1\),链二长度为 \(l2\),重叠了至少 \(k\) 次的方案,转移就是枚举下一个重合点和两条链长了多少,也就是 \(dp_{v,l1+\Delta1,l2+\Delta2,k+1}\gets dp_{u,l1,l2,k}\times f_{u,v,\Delta1}\times f_{u,v,\Delta2}\),时间复杂度为 \(O(n^3l+n^2l^5)\),显然过不了。转移的时候把 \(l1\) 和 \(l2\) 两维分开转移可以去掉一个 \(l\),也就是 \(O(n^3l+n^2l^4)\),但还是过不了。
这个转移看起来就很怪,估计不能继续优化,所以不妨猜测要推式子。
考虑把 \((k-1)^j\) 乘进 \(g_j\) 里,也就是转移的时候多乘一个 \(k-1\),然后就做完了。
洛谷P10879 「KDOI-07」对树链剖分的爱
神秘。
对于一般的链加操作,除了树剖还能暴力跳。
可以先给一个多项式做法。从 \(u,v\) 开始,每次跳编号大的那个点,不妨设 \(u<v\),枚举父亲,给 \(v\) 的答案加上 \(w\),然后让 \(w=\frac{w}{r_v-l_v+1}\),再跳到父亲。
可以发现这个过程可以放到一个数组上,给所有操作一起跑,转移可以用差分优化。
qoj7419 Jiry Matchings
请输入文本。
这种题直接上去瞪眼肯定是不行的(x。有一个显然的 \(O(n^2)\) dp,就是设 \(f_{i,0/1,j}\),表示只考虑 \(i\) 子树里,\(i\) 有没有匹配上,共有 \(j\) 个匹配的最大值,转移是 简单的,\(f_{u,0,i}\gets\max\limits_{j+k=i}\{f_{u,0,j}+\max\{f_{v,0,k},f_{v,1,k}\}\},f_{u,1,i}\gets\max\{\max\limits_{j+k=i}\{f_{u,0,j}+\max\{f_{v,0,k},f_{v,1,k}\}\}+w(u,v),\max\limits_{j+k=i}\{\max\{f_{u,0,j},f_{u,1,j}\}+\max\{f _{v,0,k},f_{v,1,k}\}\}\}\)。
这种犹如屎一般的转移显然是不能直接优化的。把状态改一下变为只考虑 \(i\) 子树里,\(i\) 可不可以匹配,共有 \(j\) 个匹配的最大值,转移是 \(f_{u,0,i}\gets\max\limits_{j+k=i}\{f_{u,0,j}+f_{v,1,k}\},f_{u,1,i}\gets\max\{\max\limits_{j+k=i}\{f_{u,0,j}+f_{v,1,k}\}+w(u,v),\max\limits_{j+k=i}\{f_{u,1,j}+f_{v,1,k}\}\}\)。虽然一样是屎,不过好看了点。
根据一些网络流知识可以得到,如果把 \(f_{u,0/1}\) 看成一个函数,那么它们都是凸函数,所以可以维护一个上凸包,\((max,+)\) 卷积就是做个闵可夫斯基和。
但是闵可夫斯基的复杂度是 \(O(\lvert A\rvert+\lvert B\rvert)\),总复杂度还是 \(O(n^2)\) 的。
直接上神秘手法。树剖,对于每个点先求出不考虑重儿子的 \(f\),最后在链顶合并,合并轻儿子和重链都可以分治一下。合并重链的时候还要考虑当前分治区间的链顶和链尾有没有匹配,复杂度是 \(O(n \log^2 n)\) 的。
洛谷P5642 人造情感(emotion)
调 emo 了。
不妨先把 \(W(U)\) 求出来。这个是简单的,记 \(f_u\) 表示只考虑 \(u\) 子树的答案,\(g_u\) 表示 \(\sum\limits_{v\in son_u}f_v\),\(P(u)\) 表示端点的 lca 为 \(u\) 的路径集合。考虑转移:
如果 \(u\) 没被路径覆盖,那么贡献为 \(g_u\)。
如果 \(u\) 被路径 \((x,y,w)\) 覆盖,\((x,y,w)\in P(u)\),那么贡献为 \(w+f_u+\sum\limits_{v\in(u,v,w)}g_v-f_v\),对于每一条路径,把这一长串式子记为 \(S\)。
可以发现,对于一条路径 \((x,y)\),\(f(x,y)\) 为全局答案减去它的权值为 \(0\) 时,一定要选它的答案。而这个东西为 \(S+h_{\text{lca}(x,y)}\),\(h_u\) 表示不考虑 \(u\) 子树的答案。
用 dp 求 \(h\)。对于点 \(u,v\),\(u\) 是 \(v\) 的父亲,从 \(h_v\) 转移到 \(h_u\) 是困难的,所以考虑从 \(h_u\) 转移到 \(h_v\)。
如果 \(u\) 没被路径覆盖,有 \(h_v=h_u+g_u-f_v\)。
如果 \(u\) 被路径 \((x,y,w)\) 覆盖,就按照 \(\text{lca}(x,y)\) 分讨一下,限制为 \(x\) 和 \(y\) 都不在 \(v\) 的子树里。
如果 \(\text{lca}(x,y) = u\),那么贡献是 \(S_{(x,y,w)}+h_u-f_v\),可以把 \(P(u)\) 按 \(S\) 从大到小排个序,然后暴力枚举。
如果 \(\text{lca}(x,y)\ne u\),那么还有个限制是 \(u\) 和 \(v\) 里要有一个在 \(u\) 的子树里(另一个端点不会在 \(u\) 的子树里),贡献为 \(h_{\text{lca}(x,y)}+S_{(x,y,w)}\),这个可以放到线段树上面统计。
最后考虑怎么统计答案。根据上面说的,\((u,v)\) 对答案的贡献为 \(f_1-\left(f_{\text{lca}}+h_{\text{lca}}+\sum\limits_{v\in(u,v,w)}g_v-f_v\right)\)。
对于前两项,可以枚举 \(\text{lca}\) 算,后面那一项可以对每个点单独算贡献。
然后就会变得不 emo 了。