2023.1 做题记录

P5268 [SNOI2017] 一个简单的询问

发现可以拆询问,答案即为:

∑xq(r1,r2)−q(l1−1,r2)−q(r1,l2−1)+q(l1−1,l2−1)\displaystyle\sum_{x}q(r_1,r_2)-q(l_1-1,r_2)-q(r_1,l_2-1)+q(l_1-1,l_2-1)

其中 q(a,b)=get⁡(1,a,x)get⁡(1,b,x)q(a,b)=\operatorname{get}(1,a,x)\operatorname{get}(1,b,x).

q(a,b)q(a,b) 使用莫队维护,移动端点 l,rl,r 的过程中维护 cx,dxc_x,d_x,分别表示 [1,l],[1,r][1,l],[1,r] 区间内 xx 的出现次数.容易维护答案.

P3224 [HNOI2012] 永无乡

用并查集维护连通性,权值线段树维护联通块内的排名.

注意合并并查集和合并权值线段树的方向要一致.

P8110 [Cnoi2021] 矩阵

趣味数学题.

进行一个式子的推,我们有:

(A2)i,j=∑k=1nAi,kAk,j=∑k=1naibkakbj=aibj∑k=1nakbk=Ai,j∑k=1nAk,k\begin{aligned} \left(A^2\right)_{i,j} &= \sum_{k=1}^n A_{i,k}A_{k,j} \\ &= \sum_{k=1}^n a_ib_ka_kb_j \\ &= a_ib_j\sum_{k=1}^n a_kb_k \\ &= A_{i,j}\sum_{k=1}^n A_{k,k} \\ \end{aligned}

归纳可得:

(Ax)i,j=Ai,j(∑k=1nAk,k)x−1\left(A^x\right)_{i,j}=A_{i,j}\left(\sum_{k=1}^n A_{k,k}\right)^{x-1}

所以有:

∑i=1n∑j=1n(Ax)i,j=∑i=1n∑j=1nAi,j(∑k=1nAk,k)x−1=(∑k=1nAk,k)x−1∑i=1n∑j=1nAi,j=(∑k=1nakbk)x−1∑i=1n∑j=1naibj=(∑k=1nakbk)x−1(∑i=1nai)(∑i=1nbi)\begin{aligned} \sum_{i=1}^n\sum_{j=1}^n\left(A^x\right)_{i,j} &= \sum_{i=1}^n\sum_{j=1}^nA_{i,j}\left(\sum_{k=1}^n A_{k,k}\right)^{x-1} \\ &= \left(\sum_{k=1}^n A_{k,k}\right)^{x-1}\sum_{i=1}^n\sum_{j=1}^n A_{i,j} \\ &= \left(\sum_{k=1}^n a_kb_k\right)^{x-1}\sum_{i=1}^n\sum_{j=1}^n a_ib_j \\ &= \left(\sum_{k=1}^n a_kb_k\right)^{x-1}\left(\sum_{i=1}^n a_i\right)\left(\sum_{i=1}^n b_i\right) \\ \end{aligned}

分别计算 (∑i=1naibi)k−1\left(\displaystyle\sum_{i=1}^n a_ib_i\right)^{k-1},∑i=1nai\displaystyle\sum_{i=1}^n a_i 和 ∑i=1nbi\displaystyle\sum_{i=1}^n b_i 即可.

P2272 [ZJOI2007] 最大半连通子图

不难发现一个 SCC 中的所有点对一定满足半联通性质,所以我们先 SCC 缩点,设缩点后点的点权为其对应的 SCC 大小.

缩完点后的图变成了一个 DAG,可以发现我们只能选取这样的图中的一条链,所以我们的问题变成了求一个 DAG 中点权和最大的一条链的长度和这样的链的数目,不难用 dp 解决这个问题.

设 fuf_u 表示结束在 uu 的链的最大点权和,gug_u 表示点权和最大的链的个数.令 EuE_u 表示 uu 的入边集,wuw_u 表示 uu 的点权,我们有如下转移:

fv←max⁡(u,v)∈Ev{fu+wv}f_v\leftarrow\max_{(u,v)\in E_v}\{f_u+w_v\}

∀(u,v)∈Ev,gv←{guif fv=fu+wvgu+gvif fv<fu+wv\forall (u,v)\in E_v,g_v\leftarrow \begin{cases} g_u & \text{if }f_v=f_u+w_v \\ g_u+g_v & \text{if }f_v<f_u+w_v \end{cases}

值得一提的是,tarjan 缩点给 SCC 的编号是逆拓扑序,可以直接 dp.

LOJ10098 「一本通 3.6 例 1」分离的路径

首先注意到一个 E-BCC 中的所有点对一定有两条不同的路径联通,所以我们可以先 E-BCC 缩点.缩点完之后变成了一棵树,其中树上的所有边都是原图中的割边.

对于我们加入的一条边 (u,v)(u,v),uu 到 vv 的路径上的所有割边均被消除,为了最小化答案,我们加入的边一定都在叶子中连接.

记叶子个数为 xx.叶子个数为偶数时,我们需要连接 x2\displaystyle\frac{x}{2} 条边才能消除所有割边,这是因为一次连边最多消除 22 个叶节点;奇数时先丢掉 11 个叶节点,按照偶数方式处理,最后只剩 22 个节点时再连 11 条边,就能消除所有割边.

综上,答案为 ⌈x2⌉\displaystyle\left\lceil \frac{x}{2} \right\rceil.

LOJ10225 「一本通 6.5 练习 3」迷路

首先,无权图定长路径计数是可以 通过矩阵乘法在 O(n3log⁡k)O(n^3\log k) 内解决 的.

然后对于本题,注意到边权较小,而正权图可以拆边变成无权图,所以拆边后直接构造矩阵进行快速幂即可.

注意到这样做的点的级别为 O(Wm)O(Wm),其中 WW 是最大的边权,mm 是边的数量.总时间复杂度 O((Wm)3log⁡t)O((Wm)^3\log t),不可接受.

我们换一个建模方式.把每个点拆成 88 个点,记 uu 拆成的第 ii 个点为 uiu_i,uiu_i 和 ui+1u_{i+1} 之间存在一条边.对于原图中的一条边 (u,v)(u,v),记其边权为 ww,在拆点后对应的边为 (u1,vw)(u_1,v_w).然后对拆点后的图构造矩阵进行快速幂,复杂度 O((Wn)3log⁡t)O((Wn)^3\log t),可以通过本题.

[USACO 2005 February Gold] Secret Milking Machine

模拟赛做到的题目.似乎只有 POJ 提供这题的评测,所以在此放出题面.

题意

有一 nn 个点 mm 条边的带权图,需要找到 tt 条由 11 到 nn 的路径,使得这 tt 条路径上边权的最大值最小.

解法

看到最大值最小,考虑二分最大值.

设当前二分答案为 xx.我们断开边权大于 xx 的所有边,检查在这个图中 11 到 nn 的路径数是否满足条件.问题转化为图上路径计数问题.

容易使用网络流来解决这个问题.我们将剩下边的流量设置成 11,11 到 nn 的最大流即为路径数.

LOJ10188 「一本通 5.6 练习 1」玩具装箱

设 fif_i 为前 ii 个玩具装箱后的最小代价,有如下转移:

fi←min⁡j<i{fj+[(i−(j+1)+∑k=j+1iCk)−L]2}f_i\leftarrow\min_{j<i}\left\{f_j+\left[\left(i-(j+1)+\sum_{k=j+1}^iC_k\right)-L\right]^2\right\}

记 sx=∑i=1xCi\displaystyle s_x=\sum_{i=1}^xC_i,转移式可化为:

fi←min⁡j<i{fj+[(i−(j+1)+si−sj)−L]2}f_i\leftarrow\min_{j<i}\left\{f_j+\left[\left(i-(j+1)+s_i-s_j\right)-L\right]^2\right\}

时间复杂度为 O(n2)O\left(n^2\right),无法通过本题.

令 tx=sx+x,l=L+1t_x=s_x+x,l=L+1,注意到上式可化为:

fi←min⁡j<i{fj+tj2+2tj(l−ti)}+(l−ti)2f_i\leftarrow\min_{j<i}\left\{f_j+{t_j}^2+2t_j(l-t_i)\right\}+(l-t_i)^2

若对于当前转移有状态 fpf_p 优于 fqf_q,那么必然有:

\begin{alignedat}{} && f_p+{t_p}^2+2t_p(l-t_i) &< f_q+{t_q}^2+2t_q(l-t_i) \\ &\Rightarrow& f_p+{t_p}^2-f_q+{t_q}^2 &< -2t_p(l-t_i)+2t_q(l-t_i) \\ &\Rightarrow& \left(f_p+{t_p}^2\right)-\left(f_q+{t_q}^2\right) &< -2(t_p-t_q)(l-t_i) \\ &\Rightarrow& \frac{\left(f_p+{t_p}^2\right)-\left(f_q+{t_q}^2\right)}{(t_p-t_q)} &< -2(l-t_i) \end{alignedat}

然后就可以斜率优化了.用单调队列维护决策点,时间复杂度 O(n)O(n).

P1283 平板涂色

记第 ii 个矩形需要涂的颜色为 cic_i,需要在第 ii 个矩形之前涂完色的矩形集合为 LiL_i.

设 fS,xf_{S,x} 表示当前已涂色矩形集合为 SS,最后一次涂的颜色为 xx 时的最小涂色次数,转移时枚举本次涂色的矩形 ii 和上一次涂色的颜色 aa,转移方程如下:

fS∪{i},ci=min⁡{fS,a+[a≠ci]}f_{S\cup\{i\},c_i}=\min\{f_{S,a}+[a\not=c_i]\}

注意到 1≤N≤161\le N\le 16,允许我们将集合压位储存.

P8360 [SNOI2022] 军队

我们使用分块解决这个问题.

考虑分块如何维护颜色信息,我们可以在每个块中开 CC 个并查集,每个并查集中维护相同颜色的元素.初始化时,将每个元素插入到其颜色对应的并查集中.

先考虑怎么做第二个操作:对于整块 ii,在 ii 中颜色 xx 对应的并查集的根节点上打上标记,通过维护并查集大小,容易计算块中元素更新后的和;对于散块,暴力修改即可.

然后考虑怎么做第一个操作:对于整块,将其中颜色 xx、yy 对应的并查集合并;对于散块,将每个元素从 xx 对应的并查集中扣出来,插入 yy 对应的并查集中.注意到整块颜色合并时,如果直接将 xx 并到 yy 上,yy 上原本的标记会下传到 xx 中,所以合并时应当新建节点 zz,将 xx 和 yy 都合并到 zz 上.

P4180 [BJWC2010] 严格次小生成树

先建出最小生成树 TT,枚举不在 TT 的边集中的边 (u,v,w)(u,v,w),我们尝试用这条边去替换 TT 上的边,得到另外一个合法的生成树.要求次小生成树,这条边只会替换 TT 中 uu 到 vv 路径上最大的边权所对应的那条边,倍增或者树剖维护一下即可.题目要求严格次小生成树,只需在维护路径上最大值的同时维护一个严格次大值,若最大值等于 ww,就用这条边替换严格次大的边权所对应的那条边.