6.5. 提高组模拟赛 题解

这篇博客探讨了图论算法在解决组合优化问题中的应用,包括最小费用最大流、动态规划和网络流。文章通过实例详细解析了算法一和算法二的实现,并分析了不同算法的时间复杂度。此外,还介绍了区间修改问题的解决方案,涉及差分和贪心策略,以及在实际比赛中的题目评价。

Solution

A

对于第 xxx 轮,我们将所有满足 i+j≡x(modn−1)i+j \equiv x \pmod {n-1}i+jx(modn1)(i,j)(i,j)(i,j) 配对。注意这里 i,ji,ji,j 的下标均从 000 开始。

但是这样会导致一些数无法配对,例如当 n=6,x=2n=6,x=2n=6,x=2 时,000 已经和 222 配对了,那么 555 就无法和 222 配对了。同时,111 无法与它自己配对,所以最终会剩下 5,15,15,1 未配对。

由于每一轮中会有恰好两个未匹配的数,所以将这两个未匹配的数匹配起来即可。

B

算法一

考虑状压 dp\text{dp}dp

fi,sf_{i,s}fi,s 表示,看到第 iii 行,且第 iii 行中已匹配的点集为 sss

转移的时候,我们先进行内部修改(例如,找到 sss 中的某两个连续的 000,将它们全部修改为 111 得到 s′s's,那么 fu,sf_{u,s}fu,s 可以转移到 fu,s′f_{u,s'}fu,s),然后对下一行产生贡献(下一行与上一行的连接部分必然是 sss 的补集的子集)。

时间复杂度 O(n3m)O(n3^m)O(n3m),可以优化为 O(n2m)O(n2^m)O(n2m)

算法二

考虑网络流。

建立源点 SSS 与汇点 TTT,给矩阵中的每个点一个编号 ppp。我们可以按如下方式建图:

  • ∀i,j\forall i,ji,j,连边 (S,pi,j,1,0)(S,p_{i,j},1,0)(S,pi,j,1,0)(pi,j,T,1,0)(p_{i,j},T,1,0)(pi,j,T,1,0)

  • ∀i,j\forall i,ji,j,连边 (pi,j,pi,j+1,1,ai,j)(p_{i,j},p_{i,j+1},1,a_{i,j})(pi,j,pi,j+1,1,ai,j)(pi,j,pi+1,j,1,bi,j)(p_{i,j},p_{i+1,j},1,b_{i,j})(pi,j,pi+1,j,1,bi,j)

注意,这里的 (u,v,f,c)(u,v,f,c)(u,v,f,c) 表示,连接了一条从 uuuvvv,流量为 fff 且费用为 ccc 的边。

跑最小费用最大流即可。

C

算法一

考虑 q=1,l1=1,r1=nq=1,l_1=1,r_1=nq=1,l1=1,r1=n 如何处理。

(A,B,C)(A,B,C)(A,B,C) 是最优解,那么其中一个必要条件是: [A,B][A,B][A,B] 是一个两端高,中间低的区间,即 max⁡i=A+1B−1{ai}≤min⁡(A,B)\max_{i=A+1}^{B-1} \{a_i\} \le \min(A,B)maxi=A+1B1{ai}min(A,B)。换言之,若存在一个 [A+1,B−1][A+1,B-1][A+1,B1] 中的 iii 使 ai>aAa_i>a_{A}ai>aAai>aBa_i>a_{B}ai>aB,则相应地将 AAABBB 换成 iii 后不劣。同时,C\text{C}C 必定是 [2B−A,n][2B-A,n][2BA,n]aaa 值最大的位置。

对于某一个 BBB 而言,AAA 必然是 BBB 之前第一个比 BBB 大的位置。因为,若将 AAA 向前移则不合法,若将 AAA 向后移则不优。

综上所述,我们枚举 BBB,得到对应的 AAA,查询 2B−A2B-A2BA 处的后缀最大值 ccc,并将 c+aA+aBc+a_{A}+a_{B}c+aA+aB 更新答案即可。

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

算法二

考虑正解。由于在线处理较为困难,我们将询问离线下来一起处理。

我们从右往左扫描,并对于每个位置 iii 维护 fif_ifi,表示当 C=iC=iC=i 时的最大 aA+aB+ai(B−A≤i−B)a_{A}+a_{B}+a_{i}(B-A \le i-B)aA+aB+ai(BAiB)

当我们将 iii 向左移动一格后,fff 需要被进行更新。令此时 A=iA=iA=i 对应的 BBBjjj,则 ∀k∈[2j−i]\forall k \in [2j-i]k[2ji],有 fk:=max⁡(fk,u+ak)f_k:=\max(f_k,u+a_k)fk:=max(fk,u+ak)。这里 u=ai+aju=a_i+a_ju=ai+aj

对于一次形如 [l,r][l,r][l,r] 的查询,我们需要在 i=li=li=l立即查询 [l,r][l,r][l,r] 中的最大 fff 值。

现在,本题被我们转换为了一道纯数据结构题,考虑使用经典数据结构线段树来维护。

我们对于每一个线段树上的节点 [l,r][l,r][l,r],维护对 [l,r][l,r][l,r] 产生全局影响的最大 uuua[l,r]a[l,r]a[l,r] 的最大值以及 [l,r][l,r][l,r] 内的最大 fkf_kfk;同时,也要维护关于 uuu 的懒标记,需要适时下传并及时更新。

这里仅讨论节点信息的转移。为方便叙述,令当前所在节点为 xxx,左右儿子分别为 ls,rsls,rsls,rs,父亲节点为 fafafa;最大 uuutx,0t_{x,0}tx,0a[l,r]a[l,r]a[l,r] 的最大值为 tx,1t_{x,1}tx,1 且最大 fkf_kfktx,2t_{x,2}tx,2,有

tx,0=max⁡(tx,0,tx,fa)t_{x,0}=\max(t_{x,0},t_{x,fa})tx,0=max(tx,0,tx,fa)tx,1=max⁡(tls,1,trs,1)t_{x,1}=\max(t_{ls,1},t_{rs,1})tx,1=max(tls,1,trs,1)tx,2=max⁡(tls,2,trs,2,tx,0+tx,1)t_{x,2}=\max(t_{ls,2},t_{rs,2},t_{x,0}+t_{x,1})tx,2=max(tls,2,trs,2,tx,0+tx,1)

总复杂度 O(nlog⁡n)O(n \log n)O(nlogn),本题被解决。

D

引理 1

对于任意不小于 666 的偶数,均可以拆分为两个奇质数之和。

引理 2

对于任意奇合数,均可以拆分为三个奇质数之和。

算法一

由于本题涉及到区间修改,考虑差分,则每次修改都是将两个 111 变成 000不可能出现其他情况。特别的,对于针对 l,rl,rl,r 的一次 1→01 \to 010 的修改,其代价如下:

  • r−lr-lrl 为奇质数,则消耗 111

  • r−lr-lrl 为偶数,则消耗 222

  • r−lr-lrl 为奇合数,则消耗 333

综上所述,我们对于每两个 111 连边,其权值为消耗的步数,则一般图最小权完美匹配即为答案。

算法二

考虑贪心——我们先让 111 的个数尽可能多,再让 222 尽可能多 ⋯⋯\cdots \cdots 显然,这样是正确的

于是我们先建立一个二分图,差为奇质数的点之间有边,然后跑最大匹配即可。现在,我们成功地让 111 的个数尽可能得多了,然后我们需要让 222 越多越好。

对于空余下来的点,我们将它们按照奇偶性分类,对于同一类中的点进行两两配对,从而我们让 222 的个数尽可能得多了。剩下未匹配的点之间连 333 即可。

总复杂度 O(n2+m)O(n^2+m)O(n2+m),这里 mmm 是最大的 XXX

Summary&Evaluation

T1\text{T1}T1 这种题我很讨厌,但是既然遇到了,我就认真地做了一下,最后打表得到了 404040 分。

T2\text{T2}T2 是一道套路题,被我一眼切了,场上也是人均爆切,但有人被卡常了,我也不知道该说什么好了。

T3\text{T3}T3 是一道非常好的题,先挖掘性质,并离线用数据结构维护,考场上是真的想不到,一直在想前 log⁡n\log nlogn必有一个的性质,结果只有 404040 分。

T4\text{T4}T4 在考场上选择了果断放弃,竟然连题目都没看。但题目还是挺不错的,思路非常妙。

综上所述,本场模拟赛难度大概是黄绿紫紫,相比 NOIP 第一题过难,第二三题正常,考察了数据结构、数学、dp\text{dp}dp 与构造,但是未考察图论。体验了不挂分的喜悦,不过分依然很低。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值