模拟赛题解/2025.9.23 模拟赛
T1-小 X 与宝藏(treasure)
题面
小 游山涉水,想要找到埋藏在深林中的宝藏。
他偶然得到了这个深林的藏宝图,深林可以被看作一个 的矩阵。宝藏在地图中以 “” 被标记出来,与此同时其他地方都是 “”,同时宝藏的个数为 ,奇怪的是地图上并没有标明它描述区域的具体方位。
深林中有两条大河,一条是纵向的,一条是横向的。由于陆上的宝藏都已经被人他们开采完了,小 只好转而寻求埋藏在两条大河深处的宝藏。可他并不知道大河具体在哪,也不知道大河的宽度有多少,地图上也没有标明。他唯一确定的,是两条大河横跨整个深林。
他通过小道消息得出两条大河中的宝藏的个数之和为 。他想动用大批人马,对所有符合条件的地下进行搜寻。请你帮小 统计大河位置情况的方案数。
如即是两条大河的合法位置,注意大河方向一个为横,一个为纵,且长度都是无穷大的,宽度至少为 。蓝色和黄色分别表示了两条大河,注意它们相交的绿色区域被计算了两次贡献。
。
题解
法一
发现两条河的宝藏数是可以分开计算的,于是对于原矩阵维护一个二维前缀和和后缀和,这样宝藏的数目就可以在两个点对上统计贡献,枚举其中一个点对,用数据结构寻找另一个点即可。
复杂度 。
法二
容易发现可以 枚举其中一条大河的宝藏数量。
直接 NTT 求对于不同行,某个宝藏数量的方案数,。
因此时间复杂度为 。
T2-小 X 与数字(number)
题面
小 有 个非负整数 ,其中 。 小 很喜欢不一样的数字,但是不喜欢很大的数字,所以他希望 的值两两不同,他认为满足这个限制的数列 是好的。 给定 , 和 , 你能帮他求出好的数列的个数 的结果吗?
。
题解
考虑 取到 的方案数,不难发现为 。先考虑 ,则此时任意一个排列的方案数都是 。
设 。考虑拆贡献,用乘法分配律展开,钦定 选择了 ,那么为它们分配 的方案数是 ,其中 $$ 是把所有 从小到大排序的第 个,而剩下的位置的方案数为 ,直接乘起来就是这种钦定的总方案数。
设 是按 的顺序排好的, 为考虑完前 个 ,钦定了 个的答案之和,这里的答案不算 的部分。那么 的转移为 。
最后答案为 。
即可。
T3-小 X 与序列(seq)
题面
给定一个 个点的无根树,每个点有一个标号 。
定义一条链 的权值为按照从 到 的顺序把这条链的标号写下来之后,得到的序列的最长上升子序列长度。
你需要删掉一个点,使得剩下的链的权值的最大值最小。
。
题解
先考虑怎么算出整棵树的 。
求 一般是用一个栈来维护每种长度的结尾最小最大是多少,在树上也同样可以这么做。并且栈的长度不超过深度,所以显然可以长链剖分优化。
然后注意到删点必然是删当前最长的一条链上的点,否则没有效果。
从链的两个端点分别跑一遍长剖,就可以算出删每个点的答案了。
T4-小 X 与停车(parking)
题面
小 在一家饭店的停车场工作,她负责礼貌地接待重要的客人,保管他们的车钥匙并帮助他们停车。
一个晚上,她发现她管理的停车场中恰好有 辆车,它们共有 种不同的颜色,每种颜色恰有两辆车。我们将颜色按 到 编号。

这张图描述的是一个样例,同时呈现了唯一的第一次驾驶。
停车场共有 个车位,按 到 编号。每一个车位可以停下两辆车,一个车位只有一个入口,我们称靠近入口的为「顶上的车」,远离入口的为「底下的车」。一辆车可以从入口开出当且仅没有车挡着它。小 在停车的时候,保证每个车位要么空,要么停满两辆。要么只有一辆底下的车。
小 想要重新停放车使得每一对相同颜色的车都在一个车位里。我们并不关心车位对应什么颜色以及哪辆车在顶上哪辆车在底下。小 将执行如下操作:
- 驾驶一辆可以驶出车位的车,将车开到另一个车位,满足:
- 这个车位是空的,并把车停在底下的车位,或者,
- 这个车位有且只有一辆与当前驾驶的车颜色相同的车。 小 想知道最少的操作次数与操作方案,请你解决这个问题。
如果操作次数正确,但方案构造错误,将得到 的分数。
。
题解
若一个栈的栈底为 ,栈顶为 ,则称其为 。
首先如果栈的两个颜色相同,则不会管它们了,不可能会把其中一个挪到一个空栈。每操作一次也最多匹配一个颜色。
假如其中一个栈 满了,设其为 ,则 要动的前提是把 挪走了。我们用一个有向图刻画,对于这种情况我们连边 ,这样每个点的出度和入度之和每时每刻都 ,这使得该图的形态很单一,可以尝试对每种形态逐一攻破。
在分析之前,我们要找出了一个颜色 和其它颜色 有连边说明有一对 在同一个栈中。如果 的两个度数不全说明有一个独占一个栈,即 。
- 孤立点 (度数为 )
设其为 ,则可以将 操作一次变为 。这样只用一步,不仅匹配了 ,还多了一个空栈。绝对是不亏的。
- 一条局部链(链上的点恰恰的点没有连边)
设其为 。
首先我们无法到孤立点x的贡献:只用一步,匹配一种颜色的同时,多出一个空栈。
我们发现 的分布是 和 ,则我们可以变成 和 ,在匹配 的同时去掉了 这条边。我们可以一直这样做直到变成孤立点,这样在不借助其它栈的同时用 步将栈删完,还多出一个空栈。
类似的,只要存在入度为 ,出度为 的点,都可以通过这种方法一步一步匹配。我们可以用类似拓扑排序的方法将位于链上的点消除。
剩下入度为 的点出度均为 ,所以我们有以下情况:
-
个点 条边的环(即连通块中出度和入度均为1)。
-
一条非同向链,形如 ,可以视为若干条有向链的两端点拼接得到,尾两端点均为链尾。
-
非同向链的两端点合并。
此时不同点都无法直接用一步匹配,只能在环或者非同向链上消除。移动的限制也说明了不能在两两端点之间消除,所以我们必须要先找到一连通块消耗掉的步数和额外的空栈,操作的实质已经不离散于之前的操作。此时我们必须要有至少一个空栈,否则没有合法方案。
- 个点 条边的环
考虑合成,将环拆成两个栈为 ,此时我们必须找到一个空栈 ,将这两个栈变为 。这样我们将环花一步操作拆开,并多了一个空栈。我们接着把 这条边,设为 ,拆掉一个环,剩下的部分还是环。我们可以再这样继续拆,直至最后只剩一个栈,没法继续操作,已经是当前最优的方案,所以只要能优先清去,不会对其贡献的分产生影响。
- 一条非同向链}
此时我们要考虑从出度为2的点处断开,设其为 ,则形如 , 和 连出了两条链,此时 所在栈为 ,存在一个空栈 。
此时,如果两端的链中有一条是有向链(这种链一定存在,就是最靠近链尾的两端的出度为2的点),设这时 所在的链是向链。则可以用1步将 变为 ,消除 的边。剩下的按照前述方法又会还原一个空栈,并且相同的时候链长度减小,效果和环不一样,甚至还在最后增加一个空栈。优先进行这种操作肯定不亏。
- 非同向链两端点合并
此时我们不妨不将两个出度为2的点 ,其为 ,通过 变为 ,这里要留1步才行,消去一个空栈,将剩下的安排为向同向链。这额外的1步和一个空栈不得不使用,但后续的清除时,所以它应放到最后处理。
只要模拟这样的过程即可,复杂度 。
