模拟赛8.3 解题报告

T1 跑路#

题意:一个矩阵,每个数为 0/1。每次操作选一个子矩阵,把子矩阵中的所有数取反。求使得矩阵出现一条从 (1,1)(n,m) 全为 0 的最短路径的最小操作数。

对于任意一条 (1,1)(n,n) 的最短路径 P,我们若令 P 上的数全部变成 0,需要选择若干个矩阵操作。不难发现,此时的最小操作数为 P1 的连续段数。

f[i,j] 表示到达 (i,j)1 的最小连续段数,O(nm) 的 DP 即可解决。

T2(AGC010C) 清扫#

题意:有一棵 n 个点的树,每个点 u 有一个非负权值 au。进行若干次操作,每次操作选择两个叶子节点 v1,v2,若对于任意一点 uPath(v1,v2),满足 au>0,则令所有 au(uPath(v1,v2)) 减一。判断是否能使所有权值变成 0。叶子节点定义为度数为 1 的点。

抽象题需要大力设数,设 g[u] 表示 u 的子树中的叶子节点与 u 子树外的叶子节点的操作数。

为了方便,我们先找一个非叶子节点作为根(n<3 时特判)。对于点 u,若我们已知 g[v](vson(u)),设 sumg=vg[v], mxg=maxv{g[v]},若 sumg<au,显然无解。否则每个儿子需要互相合并一些操作,共合并 sumgau 次。根据经典套路,我们最多可以合并 min(sumg2,sumgmxg) 次,判断合法性,然后计算

g[u]=sumg2(sumgau)=2ausumg

显然最后根节点的 g0,再判断一次根节点即可。

T3(ARC092F) 定向#

给出一张有向图,对于每条边,判断将其反向后 SCC 数量是否改变。

n1000,m2×105

对边 (u,v) 分类。

  • (u,v)SCC 外的边(连接两个 SCC 的边)

uv 存在另一条路径,那么 (u,v) 反向后,存在环 uvuSCC 数量减一。

  • (u,v)SCC 内的边

(u,v) 反向,该 SCC 割裂的条件: uv 不存在其他路径。

于是,边 (u,v) 反向后改变 SCC 数量的条件:v→u存在路径 xor u→v存在其他路径 =1

第一项好做,第二项呢?

大力发扬人类智慧,若边 (u,v)u 的出边中处于位置 p,那么另一条路径包含的 u 的一条出边肯定在 p 的前面或后面。于是我们从前往后遍历出边,从后往前便利出边,进行两次 Dfs。若两次所占的 u 的出边有一条不是 (u,v) 那么说明存在其他路径。

时间复杂度 O(nm)

T4(ARC089F) 染色#

题意:n 个球,m 次染色操作。给出长为 mr,b 组成的字符串 s,若 si=r,第 i 次操作为选择一段区间染红色,否则为选择一段小球都是红色的区间染蓝色。初始时所有小球都是白色的,求染完后小球的颜色情况有多少种可能,模 109+7

非常复杂。

首先每一个非白色极长段肯定是先用红色全染,再用红蓝再上面染。我们以最少染色次数来计数,分成两类:

  • 最终全是红色的大红段

  • 最终有蓝有红的杂色段

先考虑杂色段。我们发现,若蓝色小段一共有 k 小段,那么我们至少需要 k+1 次染色,其中一次为一开始的大红段整体染色。而且,第二次染色一定是用蓝色染,剩下的颜色随便。即一个有 4 个蓝色小段的杂色段,染色序列为 rbXXX,任意一种染色序列都能染出所有可行方案。

si 表示第 i 个杂色段的蓝色小段数量,ti 表示 第二次染色的时间从小到大的第 i 个染色段从第二次染色的时间开始,有多少次染色是没有用过的(“用过”指杂色段的第一次大红染色,以及每个大红段的一次染色)。

若一共有 c 个杂色段,对于任意一个 i(1ic)

tij=icsj

我们把 s 降序排序,即可令满足条件的可能性最大化。

先不考虑每个段(不管大段还是小段)的长度,如何计数这些杂色段的排列数?显然蓝色小段数量相等的段是一样的,这就是一个多重集排列数,我们可以 DP 做。在 DP 的同时去满足上式条件限制。

f[i,j,k] 表示填写了 si...c,其中 p=icsp=j,  si=k,此时所有方案的多重集排列数。

枚举 x 表示 si=si+1==si+x1>si+x,枚举 si+x=y<k,那么

f[i,j,k]=x,yf[i+x,jkx,y]×C(ci+1,x)

这个 DP 是 O(n4logn) 的,前缀和优化可至 O(n3logn)

为了满足条件,有 jti,对于 x[i+1,x] 都有 jkxti+x,后者可以在枚举 x 的时候顺便判断。

现在考虑大红段,设有 a 个大红段。贪心考虑,可知我们先让杂色段占掉靠前的 r,让大红段占掉剩下的一些 r。然后我们对大红段和杂色段之间计算排列组合方案数:C(c+a,c)

考虑每个段的长度和白色段的长度。设杂色段的 i=1csi=s0,对于每个杂色段,若有 k 个小蓝段,则 k 个小蓝段和夹在其中的 k1 个小红段长度至少为 1,即杂色段有 2s0c 个长度至少为 1 的段;白色段有 a+c1 个段长度至少为 1;大红段有 a 段。

则长度至少为 1 的段数:

2s0c+a+c1+a=2s0+2a1

杂色段两侧的小红段可有可无,整个小球序列的两侧的白色段可有可无,进一步推出所有可能的段数:

2s0+2a+2c+1

然后用插板法就行了。

于是答案为

C(c+a,c)×f[1,j,k]×C(n(2j+2a1)+(2j+2a+2c+1)1,2j+2a+2c+11)

最后枚举个 a,c 即可,时间复杂度 O(n5logn)

出处:https://www.cnblogs.com/Sktn0089/p/17609797.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Lgx_Q  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示