2023.1 做题记录

P5268 [SNOI2017] 一个简单的询问

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

xq(r1,r2)q(l11,r2)q(r1,l21)+q(l11,l21)\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=aibjk=1nakbk=Ai,jk=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)x1\left(A^x\right)_{i,j}=A_{i,j}\left(\sum_{k=1}^n A_{k,k}\right)^{x-1}

所以有:

i=1nj=1n(Ax)i,j=i=1nj=1nAi,j(k=1nAk,k)x1=(k=1nAk,k)x1i=1nj=1nAi,j=(k=1nakbk)x1i=1nj=1naibj=(k=1nakbk)x1(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)k1\left(\displaystyle\sum_{i=1}^n a_ib_i\right)^{k-1}i=1nai\displaystyle\sum_{i=1}^n a_ii=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 的点权,我们有如下转移:

fvmax(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)uuvv 的路径上的所有割边均被消除,为了最小化答案,我们加入的边一定都在叶子中连接.

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

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

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

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

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

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

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

[USACO 2005 February Gold] Secret Milking Machine

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

题意

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

解法

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

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

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

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

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

fiminj<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,转移式可化为:

fiminj<i{fj+[(i(j+1)+sisj)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,注意到上式可化为:

fiminj<i{fj+tj2+2tj(lti)}+(lti)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,那么必然有:

fp+tp2+2tp(lti)<fq+tq2+2tq(lti)fp+tp2fq+tq2<2tp(lti)+2tq(lti)(fp+tp2)(fq+tq2)<2(tptq)(lti)(fp+tp2)(fq+tq2)(tptq)<2(lti)\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+[aci]}f_{S\cup\{i\},c_i}=\min\{f_{S,a}+[a\not=c_i]\}

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

P8360 [SNOI2022] 军队

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

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

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

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

P4180 [BJWC2010] 严格次小生成树

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