一大堆错,别喷了。

前言

下图取自某人的 PPT,有删改。

题面

APIO2014 序列分割

题目大意

你正在玩一个关于长度为 nn 的非负整数序列的游戏,第 ii 个位置的值为 aia_i

这个游戏中你需要把序列分成 k+1k + 1 个非空的块,为了得到 k+1k + 1 块,你需要重复下面的操作 kk 次:

  • 选择一个有超过一个元素的块(初始时你只有一块,即整个序列)。

  • 选择两个相邻元素把这个块从中间分开,得到两个非空的块。

每次操作后你将获得那两个新产生的块的元素和的乘积的分数,你想要最大化最后的总得分。

数据范围

2n1052 \le n \le 10^51kmin{n1,200}1 \le k \le \min\{n - 1, 200\}

闲话:pjt 问我 T1 是什么,我说是动态规划板子,这很合理。

CF1517G Starry Night Camping

题目大意

nn 顶帐篷,第 ii个帐篷位于点 (xi,yi)(x_i, y_i) 上,权值为 wiw_i。当且仅当 xix_iyiy_i 都是偶数时,帐篷 ii 才是重要的。

移除一些帐篷,使得对于每个剩余的重要帐篷 (x,y)(x, y),不存在另外 33 个帐篷 (x1,y1),(x2,y2)(x' _ 1, y' _ 1),(x' _ 2, y' _ 2)(x3,y3)(x' _ 3, y' _ 3),使得以下两个条件都成立:

  • xjx,yjy1|x'_j-x|,|y'_j-y|\le 1,对于所有 j{1,2,3}j\in\{1,2,3\}

  • 这四个帐篷形成一个平行四边形(或矩形),它的一条边平行于 xx 轴。

将未移走的帐篷权值之和最大化,输出最大值。

数据范围

1n10001\le n\le 1000109xi,yi109-10^9\le x_i,y_i\le 10^91wi1091\le w_i\le 10^9

CF1983E I Love Balls

题目大意

Alice 和 Bob 在玩游戏。他们面前有 nn 个球,第 ii 个球的价值为 viv_i,且前 kk 个球为“特殊球”,Alice 为先手。

每一轮,Alice 或 Bob 会随机从剩余的球中选取一个球并把它取出,获得它的价值。

如果这个球为特殊球,则下一轮的玩家不变,否则下一轮的玩家改变。

问 Alice 和 Bob 各自得到的价值的期望对 109+710^9 + 7 取模的值。

数据范围

多测,1T2×1051\le T\le 2\times 10^51kn4×1051\le k\le n\le 4\times 10^51vi1071\le v_i\le 10^7

CEOI2017 Building Bridges

nn 根柱子依次排列,每根柱子都有一个高度。第 ii 根柱子的高度为 hih_i

现在想要建造若干座桥,如果一座桥架在第 ii 根柱子和第 jj 根柱子之间,那么需要 (hihj)2(h_i-h_j)^2 的代价。

在造桥前,所有用不到的柱子都会被拆除,因为他们会干扰造桥进程。第 ii 根柱子被拆除的代价为 wiw_i,注意 wiw_i 不一定非负,因为可能政府希望拆除某些柱子。

现在政府想要知道,通过桥梁把第 11 根柱子和第 nn 根柱子连接的最小代价。注意桥梁不能在端点以外的任何地方相交。

数据范围

2n1052\le n\le 10^50hi,wi1060\le h_i,\vert w_i\vert\le 10^6

CF1278F Cards 加强

题目大意

mm 张牌,其中一张是王牌。

现在你执行 nn 次右侧操作:洗牌后查看第一张牌是什么。

xx 为洗牌后第一张牌为王牌的次数,现在假设洗牌时 m!m! 种牌的排列出现的概率均相等,求 xkx^k 的期望值,答案对 998244353998244353 取模。

数据范围

1n,m9982443531\le n,m\le 9982443531k1071\le k\le 10^7

闲话:本来的范围 k5000k\le 5000

gym 102331 J Jiry Matchings

题目大意

给定一棵树 nn 个节点的有边权的树,求对于 k[1,n]Zk\in[1,n]\cap\mathbb{Z} 的大小为 kk 的匹配的最大权值。

一个图的匹配就是在一张图上选择一些边,要求这些边没有公共的端点。

数据范围

1n2×1051\le n\le 2\times 10^5,时限 2s2s

solution

APIO2014 序列分割

容易得到一个性质:

同样的切法得到的答案都是一样的,换而言之切的顺序与答案无关。

容易证明,设我们把三段和为 D,C,ZD,C,Z 的三段切开,那么:

  • 先切 C,ZC,Z 的贡献为:(D+C)×Z+D×C(D+C)\times Z+D\times C,也就是 DC+DZ+CZDC+DZ+CZ
  • 先切 D,CD,C 的贡献为:D×(C+Z)+C×ZD\times (C+Z)+C\times Z,也就是 DC+DZ+CZDC+DZ+CZ

si=i=1iais_i=\sum\limits_{i=1}^i a_iFi,jF_{i,j} 表示前 ii 次切割 jj 次可以得到的贡献的最大值,注意这个的状态数是 O(nk)O(nk) 的如果 O(1)O(1) 转移是可以通过的。

我们记 fk=Fi,kf_k=F_{i,k}gk=Fi1,kg_k=F_{i-1,k},那么显然有转移方程:

fi=max{gj+sj×(sisj)}f_i=\max\{g_j+s_j\times (s_i-s_j)\}

显然添加的第 [i,j][i,j] 段会和前面所有的段都发生贡献,所以需要乘以 sjs_j

观察,Z_drj 都可以看出来可以斜率优化。

我们取任意的 j1<j2{j1}\lt {j2} 且满足 fif_i 的决策点是 j2{j2} 优于 j1{j1},那么就可以得到下面的不等式:

gj2+sj2×(sisj2)>gj1+sj1×(sisj1)g_{j2}+s_{j2}\times (s_i-s_{j2})\gt g_{{j1}}+s_{{j1}}\times (s_i-s_{j1})

整理一下得到:

(si×sj2)+(gj2sj22)>(si×sj1)+(gj1sj12)(s_i\times s_{j2})+(g_{{j2}}-{s_{{j2}}}^2)\gt (s_i\times s_{j1})+(g_{{j1}}-{s_{{j1}}}^2)

移项:

si×(sj2sj1)>gj1sj12gj2+sj22s_i\times (s_{j2}-s_{j1})\gt g_{{j1}}-{s_{{j1}}}^2-g_{{j2}}+{s_{{j2}}}^2

因为 sj2>sj1s_{j2}\gt s_{j1},所以有:

si<(gj2+sj22)(gj1sj12)sj2sj1-s_i\lt \dfrac{(g_{{j2}}+{s_{{j2}}}^2)-(g_{{j1}}-{s_{{j1}}}^2)}{s_{j2}-s_{j1}}

总结一下,如果上面的式子成立那么 j2j2j1j1 要优。

考虑建立一个直角坐标系,把 ss 作为 XX 坐标,把 g+s2g+s^2 作为 YY 坐标,那么每一个决策就都成为了一个点。

假设有三个决策点 D,C,ZD,C,Z,他们的斜率分别是 k1k_1k2k_2,且 k0k_0si-s_i,满足下图:

那么根据我们上面得到的式子有:

  • 如果 k0<k1k_0<k_1,那么 CCDD 优。
  • 如果 k0<k2k_0<k_2,那么 ZZCC 优。
  • 观察得到 k1<k2k_1<k_2,即上图是一个下凸。

那么有三种情况:

  • k0<k1<k2k_0<k_1<k_2,那么 ZZCCDD 优。
  • k1<k0<k2k_1<k_0<k_2,那么 DDZZCC 优。
  • k1<k2<k0k_1<k_2<k_0,那么 DDCCZZ 优。

发现 CC 太逊了,也就是在这个情况下是决策点永远不可能是下凸

因为永远不可能是下凸,所以肯定是上凸(好像这句话是废话)。

显然,如果决策点 kk 被选择,当且仅当这个点前面的斜率都比 k0k_0 小,它后面的点都比他大。

所以瞪眼法可以得到如果蓝线是 k0k_0 那么 DD 就是决策点。

考虑这个东西怎么维护,发现新加入的点的斜率都是 XX 坐标都是单调的,那么显然可以直接维护一个可以在末尾添加元素的玩意。

因为上凸包的斜率具有单调性,且寻找的是第一个大于的点,所以可以二分查找,转移的时间复杂度是 O(logn)O(\log n) 的。

但是发现这个题目的 k0k_0 也是递增的,所以其实比 k0k_0 小的以后都不会取到,所以可以直接在末尾弹出元素。

所以最后的时间复杂度为 O(nk)O(nk),就是一个斜率优化的板子,让某些人复习或者预习一下。

CF1517G Starry Night Camping

将节点的 xi,yix_i,y_i 的奇偶性划分成 A,B,C,DA,B,C,D 四个集合,注意相邻集合在图中需要时可以满足 dist\operatorname{dist}11 的。

容易发现对于一个不合法的四边形,一定满足四个帐篷之间的切比雪夫距离均为 11 而且四个点分别属于 A,B,C,DA,B,C,D 四个集合。

每一种帐篷只有选择或者不选择,考虑使用最小割进行求解。

因为帐篷 uu 无法在最小割中被删除,考虑将 uu 拆为两个节点 u1,u2u_1,u_2 并用权值为 wuw_u 的边链接 u1,u2u_1,u_2,如果将边 u1u2u_1\to u_2 删除,那么就意味着帐篷 uu 被放弃掉了。

考虑将集合编号相邻且在图上曼哈顿距离为 11 的节点之间连边,具体的要将编号小的 x2x_2 向集合编号较大的 y1y_1 连边边权为 infinf 的边。

最后将 AA 集合内的所有点与 SS 连边,将 DD 集合内所有的点与 TT 连边,边权都是 infinf

显然,如果节点 a,b,c,da,b,c,d 是不合法的帐篷,那么它们显然会被边权为 infinf 的边全部连接起来,那么只有割掉任意一条边权不为 infinf 的边才可以使 S,TS,T 不连通。根据上面的解释,这也就是放弃了一个帐篷。

时间复杂度为 O(n3)O(n^3),但是是网络流。

CF1983E I Love Balls

定义一般球被 Alice 拿出的期望次数和平均值分别为 p1,s1p_1,s_1,特殊球为 p2,s2p_2,s_2,那么显然 Alice 拿出的球的期望为 p1s1+p2s2p_1s_1+p_2s_2

因为 Alice 和 Bob 会等概率的拿球,所以 s1,s2s_1,s_2 就是一般球与特殊球权职和的平均。

考虑没有特殊球的情况,如果将普通球排成一列两个玩家一次取出,显然这样的期望值与题目描述的一样。

但是题目插入了 kk 个特殊球,可以理解为将原本的序列分成的几段,每一段只有在最后包含了一个普通球或者不包含,每一个玩家一次取出一段。

发现插入特殊球并没有影响玩家取出普通球的个数,可以得到 p1=nk+12p_1=\lfloor \dfrac{n-k+1}{2}\rfloor

显然 Alice 遇到的缝隙的数量是 nk+22\lfloor \dfrac{n-k+2}{2}\rfloor,每一个缝隙中遇到的球的期望是 knk+1\dfrac{k}{n-k+1},所以 p2=knk+22nk+1p_2=\dfrac{k\cdot \lfloor \dfrac{n-k+2}{2}\rfloor}{n-k+1}

CEOI2017 Building Bridges

si=j=1iwis_i=\sum\limits_{j=1}^i w_i,考虑前 ii 个柱子并且保留第 ii 个柱子的最小代价。

那么有容易想到朴素的转移方程:

fi=min{fj+si1sj+(hihj)2}f_{i}=\min\{f_j+s_{i-1}-s_j+(h_i-h_j)^2\}

考虑把这个玩意展开,得到:

fj+si1sj+hi2+hj22×hihjf_j+s_{i-1}-s_j+{h_i}^2+{h_j}^2-2\times h_ih_j

发现出现了乘积项,考虑使用斜率优化。

注意,因为 wiw_i 有负数所以 hih_i 不再递增了。

考虑如果 hh 递增,那么下面的分析会假设 j1<j2j1<j2 以得到 hj1<hj2h_{j1}<h_{j2} 来移项,但是实际上我们并没有直接的使用 j1j1j2j2 之间的大小关系。

所以我们可以换一种假设方式,假设 hj1<hj2h_{j1}<h_{j2}j2j2j1j1 优。

套路的可以得到不等式:

(2×hihj1)+(fj1sj1+hj12)+(si1+hi2)>(2×hihj2)+(fj2sj2+hj22)+(si1+hi2)(-2\times h_ih_{j1})+(f_{j1}-s_{j1}+{h_{j1}}^2)+(s_{i-1}+{h_i}^2)>(-2\times h_ih_{j2})+(f_{j2}-s_{j2}+{h_{j2}}^2)+(s_{i-1}+{h_i}^2)

移项得到:

2hi×(hj2hj1)>(fj2sj2+hj22)(fj1sj1+hj12)2h_i\times (h_{j2}-h_{j1})>(f_{j2}-s_{j2}+{h_{j2}}^2)-(f_{j1}-s_{j1}+{h_{j1}}^2)

因为有 hj1<hj2h_{j1}<h_{j2},所以如果按照 hh 排序之后满足下式就可以得到 j2j2j1j1 优:

2hi>(fj2sj2+hj22)(fj1sj1+hj12)(hj2hj1)2h_i>\dfrac{(f_{j2}-s_{j2}+{h_{j2}}^2)-(f_{j1}-s_{j1}+{h_{j1}}^2)}{(h_{j2}-h_{j1})}

容易发现应该维护下凸壳,考虑让强行让 hh 单调。

考虑分治,先处理左区间,然后再用左区间得到的结果处理右区间。

具体的,把左右区间分别递归完之后再归并排序即可,时间复杂度为 O(nlogn)O(n\log n)

另外有人发现这是 CDQ 分治吗?

CF1278F Cards 加强

定义 fif_i 表示有将 ii 个不同的元素组成的特定结构的方案数,gig_i 表示从 ii 个元素任意选出一些(可以不选)组成特定结构的方案数。

对于知道 fif_i 或者 gig_i 中的任意一个就可求解另外一个,其公式如下:

gn=i=0n(ni)fig_n=\sum\limits_{i=0}^n{n\choose i}f_i

fn=i=0n(ni)(1)nigif_{n}=\sum\limits_{i=0}^n{n\choose i}(-1)^{n-i}g_i

就是容斥,直接感性理解,相信 ljw 在讲组合数的时候会讲的。

发现有人不会斯特林数,{nk}\begin{Bmatrix}n\\ k\end{Bmatrix} 表示把 nn 个两两不同的元素,划分为 kk 个互不区分的非空子集的方案数。

简单讲一下怎么求通项公式:

GiG_i 表示将 nn 个不同元素放入 ii 个不同盒子允许为空的方案数,FiF_i 表示将 nn 个不同的元素放入 ii 个不同盒子不允许为空的方式。

那么显然:

Gi=inG_i=i^n

同时还有:

Gi=j=0i(ij)FjG_i=\sum\limits_{j=0}^i {i\choose j} F_j

发现上面的式子和二项式反演一样,所以得到:

Fi=j=0i(1)ij×(ij)×GiF_i=\sum\limits_{j=0}^i (-1)^{i-j}\times {i\choose j}\times G_i

GG 带入并化简得到:

Fi=j=0i(1)ij×i!×inj!×(ij)!F_i=\sum\limits_{j=0}^i\dfrac{(-1)^{i-j}\times i!\times i^n}{j!\times (i-j)!}

因为斯特林数的盒子不一样,所以 FkF_k 就是就是 {nk}\begin{Bmatrix}n\\ k\end{Bmatrix}k!k! 倍,所以得到:

{nk}=Fkk!=i=0k(1)ki×ini!×(ki)!\begin{Bmatrix}n\\ k\end{Bmatrix}=\dfrac{F_k}{k!}=\sum\limits_{i=0}^k\dfrac{(-1)^{k-i}\times i^n}{i!\times (k-i)!}

得到:

in=j=0ij!×(ij)×{nj}i^n=\sum\limits_{j=0}^i j!\times {i\choose j}\times \begin{Bmatrix} n\\j\end{Bmatrix}

把组合数展开然后约分得到:

in=j=1ii!(ij)!×{nj}i^n=\sum\limits_{j=1}^i \dfrac{i!}{(i-j)!}\times \begin{Bmatrix} n\\j\end{Bmatrix}

记抽出王牌的概率 1m\dfrac{1}{m}pp,那么按照题目的要求写出式子:

i=0n(ni)pi(1p)niik\sum\limits_{i=0}^n{n\choose i}p^i(1-p)^{n-i}i^k

iki^k 根据套路写成第二类斯特林数的形式:

i=0n(ni)pi(1p)nik=0j{kj}ij\sum\limits_{i=0}^n {n\choose i}p^i(1-p)^{n-i}\sum\limits_{k=0}^{j}\begin{Bmatrix}k\\ j\end{Bmatrix}i^{\underline{j}}

其中 iji^{\underline{j}} 表示 i!(ij)!\dfrac{i!}{(i-j)!}oi-wiki 里面总计了一些常用的符号。

因为 nn 太大了不可以接受,所以考虑把里面的循环提到外面去。

j=0k{kj}i=0n(ni)ijpi(1p)ni\sum\limits_{j=0}^k \begin{Bmatrix}k\\ j\end{Bmatrix}\sum\limits_{i=0}^n{n\choose i}i^{\underline{j}}p^i(1-p)^{n-i}

展开得到:

j=0k{kj}i=1ni!(ij)!n!i!(ni)!pi(1p)ni\sum\limits_{j=0}^k\begin{Bmatrix}k\\ j\end{Bmatrix}\sum\limits_{i=1}^n\dfrac{i!}{(i-j)!}\dfrac{n!}{i!(n-i)!}p^i(1-p)^{n-i}

那么合理组合得到:

j=0k{kj}i=1n(nj)!(ij)!×(ni)!×n!(nj)!×pi(1p)ni\sum\limits_{j=0}^k\begin{Bmatrix}k\\ j\end{Bmatrix}\sum\limits_{i=1}^n\dfrac{(n-j)!}{(i-j)!\times (n-i)!}\times \dfrac{n!}{(n-j)!}\times p^i(1-p)^{n-i}

考虑组合意义得到:

j=0k{kj}nji=1n(njij)pi(1p)ni\sum\limits_{j=0}^k\begin{Bmatrix}k\\ j\end{Bmatrix}n^{\underline j}\sum\limits_{i=1}^n{n-j\choose i-j}p^i(1-p)^{n-i}

发现上面的组合数太丑陋了,把 iji-j 替换为 ii 得到:

j=0k{kj}nji=0nj(nji)pij(1p)n(ij)\sum\limits_{j=0}^k\begin{Bmatrix}k\\ j\end{Bmatrix}n^{\underline j}\sum\limits_{i=0}^{n-j}{n-j\choose i}p^{i-j}(1-p)^{n-(i-j)}

观察式子发现和二项式定理很像:

(a+b)n=i=0n(ni)aibni(a+b)^n=\sum\limits_{i=0}^n {n\choose i}a^{i}b^{n-i}

pip^i 提出来,带入上式得到:

j=0k{kj}njpj(p+1p)ni\sum\limits_{j=0}^k \begin{Bmatrix}k\\ j\end{Bmatrix}n^{\underline j}p^j (p+1-p)^{n-i}

也就是:

j=0k{kj}n!(nj)!pj\sum\limits_{j=0}^k \begin{Bmatrix}k\\ j\end{Bmatrix}\dfrac{n!}{(n-j)!}p^j

这时可以 O(k2)O(k^2) 朴素求解斯特林数,也可以只用卷积做到 O(klogk)O(k\log k) 求解,但是还是无法做到线性求解。

把通项公式带入上式:

i=0knipii!j=0i(1)ij(ij)jk\sum_{i=0}^k\dfrac{n^{\underline{i}}p^i}{i!}\sum_{j=0}^i(-1)^{i-j}\binom{i}{j}j^k

交换求和的顺序:

j=0k(1)jjki=jkni(p)ii!(ij)\sum_{j=0}^k(-1)^{j}j^k\sum_{i=j}^k\dfrac{n^{\underline{i}}(-p)^i}{i!}\binom{i}{j}

展开组合数:

j=0k(1)jjki=jkni(p)ii!×i!j!(ij)!\sum\limits_{j=0}^k(-1)^jj^k\sum\limits_{i=j}^k \dfrac{n^{\underline{i}}(-p)^i}{i!}\times \dfrac{i!}{j!(i-j)!}

整理一下:

j=0k(1)jjkj!i=jkni(p)i(ij)!\sum_{j=0}^k\dfrac{(-1)^{j}j^k}{j!}\sum_{i=j}^k\dfrac{n^{\underline{i}}(-p)^i}{(i-j)!}

和上面的套路同样的,把 ii 替换为 i+ji+j 得到:

j=0k(1)jjkj!i=0kjni+j(p)i+ji!\sum\limits_{j=0}^k\dfrac{(-1)^jj^k}{j!}\sum\limits_{i=0}^{k-j}\dfrac{n^{\underline{i+j}}(-p)^{i+j}}{i!}

整理一下得到:

j=0k(1)jjk(p)jj!i=0kjni+j(p)ii!\sum_{j=0}^k\dfrac{(-1)^{j}j^k(-p)^j}{j!}\sum_{i=0}^{k-j}\dfrac{n^{\underline{i+j}}(-p)^i}{i!}

继续变形得到:

j=0kjkpjn!j!(nj)!i=0kj(nj)!i!(nij)!×(p)i\sum_{j=0}^k\dfrac{j^kp^jn!}{j!(n-j)!}\sum_{i=0}^{k-j}\dfrac{(n-j)!}{i!(n-i-j)!}\times (-p)^i

考虑组合意义得到:

j=0kjkpjnjj!i=0kj(nji)(p)i\sum\limits_{j=0}^k\dfrac{j^kp^jn^{\underline j}}{j!}\sum\limits_{i=0}^{k-j}{n-j\choose i}(-p)^i

观察上式的第二个 σ\sigma 的前面,发现:

  • 阶乘和下降阶乘幂显然可以 O(k)O(k) 预处理。
  • g(x)=pxg(x)=p^x 显然可以 O(k)O(k) 预处理。
  • g(x)=xkg'(x)=x^k 是积性函数,可以通过欧拉筛 O(k)O(k) 预处理。

所以我们只需要在 O(k)O(k) 或者更低的时间复杂度内求解出后面的玩意就可以了。

考虑设函数:

f(j)=i=0kj(nji)pif(j)=\sum_{i=0}^{k-j}\binom{n-j}{i}p^i

那么容易想到可以去递推求解,那么直接考虑两式的差:

i=0kj+1(nj+1i)pii=0kj(nji)pi\sum_{i=0}^{k-j+1}\binom{n-j+1}{i}p^i-\sum_{i=0}^{k-j}\binom{n-j}{i}p^i

那么把可以相像的项写道一起得到:

i=0kjpi[(nj+1i)(nji)]+(nj+1kj+1)pkj+1\sum_{i=0}^{k-j}p^i\left[\binom{n-j+1}{i}-\binom{n-j}{i}\right]+\binom{n-j+1}{k-j+1}p^{k-j+1}

因为组合数的意义有:

i=0kjpi[(nji)+(nji1)(nji)]+(nj+1kj+1)pkj+1\sum_{i=0}^{k-j}p^i\left[{n-j\choose i}+{n-j\choose i-1}-\binom{n-j}{i}\right]+\binom{n-j+1}{k-j+1}p^{k-j+1}

整理得到:

i=0kj(nji1)pi+(nj+1kj+1)pkj+1\sum_{i=0}^{k-j}\binom{n-j}{i-1}p^i+\binom{n-j+1}{k-j+1}p^{k-j+1}

同样的处理掉组合数里的 i1i-1 得到:

pi=0kj1(nji)pi+(nj+1kj+1)pkj+1p\sum_{i=0}^{k-j-1}\binom{n-j}{i}p^i+\binom{n-j+1}{k-j+1}p^{k-j+1}

考虑把 f(j)f(j) 带入上式:

p[f(j)(njkj)pkj]+(nj+1kj+1)pkj+1p\left[f(j)-\binom{n-j}{k-j}p^{k-j}\right]+\binom{n-j+1}{k-j+1}p^{k-j+1}

把式子展开然后提取公因式得到:

pf(j)+[(nj+1kj+1)(njkj)]pkj+1pf(j)+\left[\binom{n-j+1}{k-j+1}-\binom{n-j}{k-j}\right]p^{k-j+1}

根据组合数的性质,类似与上面的化简得到:

pf(j)+(njkj+1)pkj+1pf(j)+\binom{n-j}{k-j+1}p^{k-j+1}

也就是:

f(j1)f(j)=pf(j)+(njkj+1)pkj+1f(j-1)-f(j)=pf(j)+\binom{n-j}{k-j+1}p^{k-j+1}

消元得到:

f(j1)=(p+1)f(j)+nk+1nj(kj+1)!pkj+1f(j-1)=(p+1)f(j)+\dfrac{n^{\underline{k+1}}}{n^{\underline{j}}(k-j+1)!}p^{k-j+1}

带入容易得到 f(min{n,k})=1f(\min\{n,k\})=1,所以原式就是:

j=0kjk(p)jnjj!f(j)\sum_{j=0}^k\dfrac{j^k(-p)^jn^{\underline{j}}}{j!}f(j)

注意 pp 的符号变了,记得递推的时候处理。

所有操作的时间复杂度均为 O(k)O(k),这个问题就解决了。

gym 102331 J Jiry Matchings

做这个题之前需要了解一些前置知识。

定义一个排列是凸序列,当且仅当满足这个序列的差分数组单调不升;反之如果这个序列的差分数组单调不降,那么这个序列就是凹序列。

max/min,+\max/\min,+ 卷积优化 DP,对于这样的一个转移方程:

fi=maxj+k=igj+hkf_{i}=\max\limits_{j+k=i} g_j+h_k

显然这个玩意可以 O(n2)O(n^2) 的转移,但是如果 gghh 都是凸序列,那么就会有更优的做法。

那么把 f0f_0 初始化为 g0+h0g_0+h_0,然后把两个序列看成:

g1g0,g2g1,g3g2,,gngn1h1h0,h2h1,h3h2,,hnhn1\begin{array}{}g_1-g_0,g_2-g_1,g_3-g_2,\cdots,g_{n}-g_{n-1}\\h_1-h_0,h_2-h_1,h_3-h_2,\cdots,h_{n}-h_{n-1}\end{array}

那么求解 fkf_k 就相当于在两个序列的开头分别选择一些元素,要求总共选择 kk 个元素,然后加上 f0f_0

因为这两个序列都是上凸的,所以其差分数组是单调不升的,于是贪心的维护两个指针选择最开头的元素中大的那一个就行了,这样也就是可以在 O(n)O(n) 的时间复杂度里求解了。

不知道有没有人听说过闵可夫斯基和。

设在以 xx 为根的子树中,选择 ii 条边且 xx 可以被选择得到的匹配的最大值为 fx,if_{x,i}

注意,这里必须是可以选择,否则因为一些神奇的原因 ff 不会是一个凸序列。

类似的,设不被选择的最大值为 gx,ig_{x,i}

观察发现 fxf_xgxg_x 都是凸序列,zjk 都不会证你觉得我会吗

感性理解一下,树是一个二分图,带权的二分图匹配可以转化成费用流,因为是费用流所以可以通过 zjk 都不会的证明得到是一个凸序列。

显然这样有一个暴力的 DP 转移,在合并的时候是一个类似于背包的转移,仔细观察发现是一个 max,+\max,+ 的卷积,刚好可以用凸排列优化,所以我们就可以线性的合并。

但是即使可以线性的合并,但是这样的状态数还是 O(n2)O(n^2) 的无法通过,使用分治和树剖优化。

考虑减少状态数,即只求解每一个重链的头的 ffgg 的值。

对于一个重链上的点,先只考虑非重儿子的合并。

考虑递归求解,这样所有的非中儿子的 f,gf,g 都已经求解出来了。

用 FFT 的思想进行分治,每一次把轻儿子分成两半然后合并。

考虑分析时间复杂度,建出递归树,因为每一次区间长度都会减半所以最多只有 logn\log n 层。

通过 max,+\max,+ 卷积合并两个长度为 o,po,pf,gf,g 的时间复杂度显然为 O(o+p)O(o+p)

假设所有的轻儿子的 f,gf,g 的项数之和为 mm,那么一层所需的时间复杂度就是 O(m)O(m)

因为总共有 logn\log n 层,所以显然处理轻儿子所需的时间复杂度为 O(mlogn)O(m\log n)

通过这个方式合并出轻儿子之后考虑对这个重链上的点进行分治,设 hl,r,0/1,0,1h_{l,r,0/1,0,1} 表示合并了 [l,r][l,r] 这个区间,左右端点是否可以选择得到的 ffgg 的值。

那么同样的如果长度为 nn,那么用类似上面的分治方法就可以做到 logn\log n 次合并操作。

因为 hl,rh_{l,r} 的项数并不会多于所有的轻儿子的子树的和,所以我们也可以做到 O(mlogn)O(m\log n) 的合并。

考虑上面的操作,所有的时间复杂度相加得到最终的时间复杂度为 O(mlogn)O(\sum m\log n)

对于树剖,有性质任意一个点到根节点的所经过的重链数量都不会超过 logn\log n

如果一个节点是重链的开头,那么必然存在一个兄弟节点的大小大于自己,所以这个节点子树的大小至少都会是其父节点的一半。

因为大小每一次都会减半,所以重链最深只会有 logn\log n 个,自然一个节点向上遍历遇到的重链也不会超过 logn\log n 条。

对于每一个节点,对于 m\sum m 的贡献只会在脱离自己的重链时被计算一次,所以 (m)=nlogn(\sum m)=n\log n,最终的复杂度也就是 O(nlog2n)O(n\log^2 n)