T1 跑路#
题意:一个矩阵,每个数为 。每次操作选一个子矩阵,把子矩阵中的所有数取反。求使得矩阵出现一条从 到 全为 的最短路径的最小操作数。
对于任意一条 到 的最短路径 ,我们若令 上的数全部变成 ,需要选择若干个矩阵操作。不难发现,此时的最小操作数为 上 的连续段数。
设 表示到达 时 的最小连续段数, 的 DP 即可解决。
T2(AGC010C) 清扫#
题意:有一棵 个点的树,每个点 有一个非负权值 。进行若干次操作,每次操作选择两个叶子节点 ,若对于任意一点 ,满足 ,则令所有 减一。判断是否能使所有权值变成 。叶子节点定义为度数为 的点。
抽象题需要大力设数,设 表示 的子树中的叶子节点与 子树外的叶子节点的操作数。
为了方便,我们先找一个非叶子节点作为根( 时特判)。对于点 ,若我们已知 ,设 ,若 ,显然无解。否则每个儿子需要互相合并一些操作,共合并 次。根据经典套路,我们最多可以合并 次,判断合法性,然后计算
显然最后根节点的 为 ,再判断一次根节点即可。
T3(ARC092F) 定向#
给出一张有向图,对于每条边,判断将其反向后 数量是否改变。
对边 分类。
若 存在另一条路径,那么 反向后,存在环 , 数量减一。
若 反向,该 割裂的条件: 不存在其他路径。
于是,边 反向后改变 数量的条件:v→u存在路径
u→v存在其他路径
。
第一项好做,第二项呢?
大力发扬人类智慧,若边 在 的出边中处于位置 ,那么另一条路径包含的 的一条出边肯定在 的前面或后面。于是我们从前往后遍历出边,从后往前便利出边,进行两次 。若两次所占的 的出边有一条不是 那么说明存在其他路径。
时间复杂度 。
T4(ARC089F) 染色#
题意: 个球, 次染色操作。给出长为 由 组成的字符串 ,若 ,第 次操作为选择一段区间染红色,否则为选择一段小球都是红色的区间染蓝色。初始时所有小球都是白色的,求染完后小球的颜色情况有多少种可能,模 。
非常复杂。
首先每一个非白色极长段肯定是先用红色全染,再用红蓝再上面染。我们以最少染色次数来计数,分成两类:
先考虑杂色段。我们发现,若蓝色小段一共有 小段,那么我们至少需要 次染色,其中一次为一开始的大红段整体染色。而且,第二次染色一定是用蓝色染,剩下的颜色随便。即一个有 个蓝色小段的杂色段,染色序列为 XXX,任意一种染色序列都能染出所有可行方案。
设 表示第 个杂色段的蓝色小段数量, 表示 第二次染色的时间从小到大的第 个染色段从第二次染色的时间开始,有多少次染色是没有用过的(“用过”指杂色段的第一次大红染色,以及每个大红段的一次染色)。
若一共有 个杂色段,对于任意一个
我们把 降序排序,即可令满足条件的可能性最大化。
先不考虑每个段(不管大段还是小段)的长度,如何计数这些杂色段的排列数?显然蓝色小段数量相等的段是一样的,这就是一个多重集排列数,我们可以 DP 做。在 DP 的同时去满足上式条件限制。
设 表示填写了 ,其中 ,此时所有方案的多重集排列数。
枚举 表示 ,枚举 ,那么
这个 DP 是 的,前缀和优化可至 。
为了满足条件,有 ,对于 都有 ,后者可以在枚举 的时候顺便判断。
现在考虑大红段,设有 个大红段。贪心考虑,可知我们先让杂色段占掉靠前的 ,让大红段占掉剩下的一些 。然后我们对大红段和杂色段之间计算排列组合方案数:。
考虑每个段的长度和白色段的长度。设杂色段的 ,对于每个杂色段,若有 个小蓝段,则 个小蓝段和夹在其中的 个小红段长度至少为 ,即杂色段有 个长度至少为 的段;白色段有 个段长度至少为 ;大红段有 段。
则长度至少为 的段数:
杂色段两侧的小红段可有可无,整个小球序列的两侧的白色段可有可无,进一步推出所有可能的段数:
然后用插板法就行了。
于是答案为
最后枚举个 即可,时间复杂度 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下