比赛记录(41~50)
41 CSP-S 模拟赛23
1 得分
题目 | T1 | T2 | T3 | T4 | 总分 |
---|---|---|---|---|---|
得分 |
排名:rank
2 题解
T1
考虑对数组求前缀和,可以得到
T2
容易发现,当所有书的本数都不超过其它书的本数加一时,绝对能放完。因此我们只需要判断是否有书的数量大于了
- 设两个变量
,初始 。 - 当
时,将 赋为 。 - 否则若
, ;否则 。
由于如果存在一本书数量大于
最后我们计算答案。如果不存在书数量大于
T3
Part 1:
考虑当所有
无解的情况有四种:
Part 2:
考虑当
对于块外的情况,与上面
T4
Part 1:
考虑没有重复数字时怎么做。
我们需要先知道一个性质,就是我们每一次操作后剩下的数不能小于当前的中位数。于是我们先排序,第一次就只能放下
- 当原先有奇数个数的时候,此时中位数一定是某一个数
。考虑新加进来的值 以及第一个比 大的值 ,那么必须满足 ,即 。于是如果 中已经有数,就可以放当前的最大值;否则就必须放该区间中的最大值。 - 当原先有偶数个数的时候,此时如果
中已经有数,就可以放当前最大值;否则就只能放 。
我们可以用对顶堆来维护中位数,然后按照上面的规则放即可。
Part 2:
考虑有重复数字时怎么做。我们设
42 CSP-S 模拟赛24
1 得分
题目 | T1 | T2 | T3 | T4 | 总分 |
---|---|---|---|---|---|
得分 |
排名:rank
2 题解
T1
容易发现,符合要求的边必须存在于所有奇环、不存在于所有偶环。但是所有的环太多了,这个时候就考虑选取一些环来代表。考虑无向图上常见的套路:DFS 树,我们只需要考虑由一些树边和一条返祖边构成的环,然后所有环都可以由它们异或得到。
但是如果暴力维护环复杂度仍然不优,我们可以考虑将边权下放到点,然后树上差分。这样复杂度就是严格
T2
容易发现如果肥料能流到当前节点,那么在该节点的根链上所有指向左儿子的点的点权都要比该点点权大、所有指向右儿子的点的点权都要比该点点权小。我们可以考虑先树链剖分,然后现在每一个点都有了在树链上对应的指向。接下来开一颗线段树,维护区间内所有指向左儿子的点的最小值、所有指向右儿子的点的最大值。
考虑交换子树怎么做,其实我们只需要交换区间内指向左儿子的点的最小(最大)值 和 指向右儿子的点的最小(最大)值然后打标记。但是上面我们只维护了两个信息,所以实际上我们要维护的是区间内所有指向左儿子的点的最小 / 最大值、所有指向右儿子的点的最小 / 最大值。
T3
考虑我们要让
那么考虑整棵树上的情况,实际上就是要求出一个排列
T4
Part 1:
我们发现这个操作是一个幂塔的形式,考虑利用扩展欧拉定理,那么我们就可以得到:
我们可以利用递归去求出不同层数的幂塔对应的结果,这样在计算时可以直接调用。
Part 2:
考虑上述幂塔的层数,容易发现最后模数会变成
实际上这个结论的用处不止于此。考虑到由于幂塔只有
43 CSP-S 模拟赛25
1 得分
题目 | T1 | T2 | T3 | T4 | 总分 |
---|---|---|---|---|---|
得分 |
排名:rank
2 题解
T1
实际上不难发现,如果点对之间有至少一条出现次数为奇数的边权,那么一定先手必胜。考虑 “至少一次” 不好维护,利用容斥改为总方案数 - 所有边权出现次数均为偶数的方案。
这个东西和 2024.8.8 T3 十分相似,我们可以用
但是注意到此题中边权即使离散化也有
T2
通过观察样例,可以得到的是最后我们一定是在某个区间反复横跳去累加答案。但是我们并不能一次就跳到任意一个区间的右端点。实际上,我们应该是第一次先跳到一个
于是我们就可以考虑对区间的右端点进行 dp。设
最后枚举以哪一个区间作为最后横跳的区间然后取最大值即可。
T3
直接给出构造方式。考虑维护出以
下面说明其正确性。显然省要么是一个联通块,要么加上省会后是一个联通块。所以一个根节点的不同子树可以合起来构成一个省。考虑上述添加子集的过程,容易发现,我们返回的
在最后考虑
T4
Part 1:
发现区间循环右移实际上就是区间平移,因此考虑使用 FHQ-Treap 实现区间操作。那么难点就在于如何判断有无三元上升子序列。考虑三元上升子序列在 FHQ 里有哪几种表现方式,不难发现是如下几种:
- 左子树
- 当前根节点 - 右子树 。 - 左子树
- 右子树 。 - 左子树
- 右子树 。
所以我们需要维护四个值:
问题就在于
Part 2:
(下文以
我们发现
我们考虑这样一件事,如果当前区间的
那么最后的复杂度就是
44 CSP-S 模拟赛26
1 得分
题目 | T1 | T2 | T3 | T4 | 总分 |
---|---|---|---|---|---|
得分 |
排名:rank
2 题解
T1
考虑维护两个 dp 数组,设
按照
T2
显然网的左端点在鱼上最优。考虑枚举撒网的左端点的鱼的编号
也就是:
于是我们可以解出每一条鱼被捕上要满足的时间所在的区间
T3
考虑将所有
现在考虑限制条件,当我们插入一个
T4
考虑会被染上颜色的点满足什么条件,显然是:
- 子树内有关键点。
- 子树外有关键点。
考虑利用容斥,用满足第一个限制的点的个数减去满足第一个限制但不满足第二个限制的点的个数。
Part 1:
后面一部分是好计算的,显然就是区间内所有点的 LCA 的所有祖先。区间内所有点的 LCA 实际上就是 DFS 序最小和最大的点的 LCA,直接计算即可。
Part 2:
考虑离线处理第一部分。我们每一次取移动右端点,设
我们考虑从
具体的,当我们找到一段区间
复杂度是
45 CSP-S 模拟赛27
1 得分
题目 | T1 | T2 | T3 | T4 | 总分 |
---|---|---|---|---|---|
得分 |
排名:rank
暑假最后一场给了坨大的(指题目难度)。
2 题解
T1
容易列出 dp 方程:设
这样做的复杂度是
这个式子非常简单,我们维护上凸包然后单调队列即可。不过发现这里还有其他的限制条件,就是下面的
(尽管这个难度放 S 组 T1 已经很离谱了,但是它确实是最简单的题)
T2
Part 1:
考虑
考虑记录出每个元素出现的次数 1 << 4
表示),将这个作为记搜的标志。
但是这里会存在一个问题,就是当最后一个元素在序列中的个数不同时,答案是不同的。而且会发现当且仅当最后一个元素在序列中出现的次数不同时才会不同,其他元素没有影响。所以我们还要记录最后一个元素出现的次数
Part 2:
考虑 ababa...bacdcdc...dcefef...fe....
的,我们直接每一次输出一段形如 abab...ba
的前缀都会使
T3
考虑到什么时候会存在
考虑第一个元素
。 。
那么大分类讨论一下两个情况。先考虑第二种情况,即
- 显然
应该是 。 - 显然
应该是 。
于是此时
令
(注意这里取不到上界
然后考虑
于是可以得到
此时可以
考虑到在枚举
暴力枚举
T4
考虑到我们要求的是复数之和的模长,因此考虑将所有复数放到复平面上考虑,这样我们就只要求出
考虑枚举最后相加得到的向量的幅角
实际上是不会抵消的,但是如果枚举的
不能使其他的方向被抵消,那么一定会存在一个更优的 使得贡献被抵消,那么答案会更优。
于是我们就考虑枚举这个
46 CSP-S 模拟赛28
1 得分
题目 | T1 | T2 | T3 | T4 | 总分 |
---|---|---|---|---|---|
得分 |
排名:rank
2 题解
T1
简单题。考虑对
T2
首先注意到
假如当前枚举的
接下来设三个函数:
表示满足 的 总数。 表示满足 的 总数。 表示满足 的 总数。
显然
同时令
上式就是基础的莫反,那么同理我们可以得到:
注意
于是就得到:
直接暴力枚举
T3
题面的限制其实是类 LIS,所以首先考虑 dp。设
原因在于当我们取到的峰值周围有与它相同的值的时候,我们的计算会重复。因此钦定峰值只能取到最先出现的那个。那么我们就需要利用容斥将不合法情况减去。
容易发现这个做法直接做是
我们可以记录下当前以
发现这个时间复杂度是
具体的,我们将
T4
过于抽象,没改。
47 CSP-S 模拟赛29
1 得分
题目 | T1 | T2 | T3 | T4 | 总分 |
---|---|---|---|---|---|
得分 |
排名:rank
2 题解
T1
40 pts:爆搜即可。
another 40pts:
看到
设当前新加入的二元组是
100 pts:
考虑到这样一个结论:对于序列
实际上根据上面的性质,不难推出转移的最大值就是
或 。用 记录取到的是加一还是不加一的然后按照同样方式转移即可,复杂度可以降为 。
T2
60 pts: 分两部分暴力模拟即可。
100 pts:
考虑到有绝对值,容易想到进行拆分。问题转化为求一个点左上、左下、右上、右下的卫星贡献总和。
我们考虑对所有
对四个方向都做一遍然后累加即可。由于要多次求幂且底数不变,可以使用光速幂进行优化。
T3
我们考虑这样一种暴力:在所有查询中找出本质不同的查询二元组
实际上,这个暴力在时间复杂度上是完全正确的,证明如下:
设字符串总长为
,考虑一个阈值 。 先看所有长度
的串,显然最多有 个。那么考虑将他们之间两两的答案计算出来,易得这一部分的复杂度是 。 然后是所有长度
的串,他们最多会有 次查询,单次查询复杂度 ,因此这一部分复杂度为 。 两部分复杂度总和为
,可以知道 时式子有最小值 。 显然上述算法的本质就是暴力算法,两者复杂度一致,因此“暴力”算法的复杂度应该是
的。
不过实际交上去会发现 WA 99pts,只错了一个。原因在于如果只用了自然溢出的单哈希会被卡,需要使用双哈希进行计算。
T4
抽象题目。
Part 1:
初步的思考是:我们希望求出对于一个节点
那么考虑连边的实质,实际上就是从
然而这只是理论上的,因为裴蜀定理求出的解可能必须要跳出
设
- 当
时,一定有 满足 ,满足条件。 - 当
时,一定有 满足 。此时若要满足条件,则必须有 ,因此必然有 ,即 ,解得 。
因此得出如果想要不跳出去,一定要满足
Part 2:
现在我们先放下思绪,冷静考虑一下。上面的分析都保证了里面有
考虑当所有
显然这样的点
此时仍然容易发现,所有的
考虑原先的最小值为
Part 3:
现在回到 Part 1 的情况,此时我们已经处理完了所有
考虑如果存在
然后剩下的数就是
那么我们就可以将中间的部分砍掉,显然剩下的部分应该保留的长度是前面的
此时问题转化成了一个新的子问题,当然此时除了
接下来继续递归求解即可。
现在就是考虑如何维护这些东西了。实际上我们发现,当我们将所有元素排序后,每一次取出的要变动的部分是从头开始的连续一段。因此可以用 set
存下当前所有的
接下来考虑复杂度,其实只需要考虑递归次数。递归次数实际上是 set
复杂度为
48 CSP-S 模拟赛30
1 得分
题目 | T1 | T2 | T3 | T4 | 总分 |
---|---|---|---|---|---|
得分 |
排名:rank
2 题解
T1
容易发现,我们可以找出当前数字中出现的极长连续段。设其长度为
T2
首先考虑在正常线段树上跑出区间
首先较为显然的一点是,这样的树一定是一颗满二叉树下面挂几个叶子节点。上面的满二叉树部分是好计算的,枚举每一层然后等差数列直接算就行。问题就在于下面这些叶子节点。
我们假设满二叉树的最后一层有
- 最后一层有
个节点,且我们需要在 个节点上挂左右子树的编号和。 - 最后一层有
个节点,且我们需要在 个节点上挂左右子树的编号和。
实际上就是分成左右两半分治。但是发现暴力分治复杂度不好,观察上面式子发现左右分治的时候答案最多只会在左边多一个,而且多出的这一个可以算出来。所以我们就可以把分治复杂度降为
考虑最后复杂度。暴力跑分割区间是
T3
发现有取
- 当
时, 。 - 当
时, 。
设
那么考虑利用线段树。我们对于一个法杖或魔咒,在其对应的
时间复杂度是
T4
30 pts: 显然考虑朴素区间 dp 即可。
100 pts:
考虑到决策一定是向左一段 - 向右一段 - 向左一段 - 向右一段 - …… 于是可以直接设
接下来考虑转移方程。显然有两种操作,向左或向右。以向左为例,我们假设从
同理可以得到向右的转移式:
根据定义,初始状态就是
那么实际上由于该 dp 的特殊性,我们可以用类似 Dijkstra 的形式转移。意思是说,我们对于未被扩展过的
这个做法复杂度和朴素 Dijkstra 一样,不够优。考虑优化。我们发现如果
此时取最小值的过程变成了
49 CSP-S 模拟赛31
1 得分
题目 | T1 | T2 | T3 | T4 | 总分 |
---|---|---|---|---|---|
得分 |
排名:rank
2 题解
T1
其实是线段树的套路题。
考虑维护线段树,枚举一个端点,然后在线段树上存储另一个端点信息。在这道题中,我们在线段树的
那么我们就先求出所有
考虑到对于固定的左端点,
由于二分的时候要再加上一个线段树的复杂度,因此总复杂度是
T2
首先我们要看到这样一个结论:
对于最优方案,一定是通过一个断点将序列断开,然后从后往前遍历,如果当前位置上有钱,就将这个位置上所有的钱平均放到最后面的位置。
手摸样例然后感性理解是比较容易得到的。但是难点不在这里,我们发现这样断开的序列是要有要求的,显然要求如下:
对于每一个长度为
的后缀,其后缀和必须小于 。
显然只有满足这个条件,才能使得每一次往后挪动钱的时候能放得下。然后就是考虑怎样求满足条件的序列。我们还是从后往前扫,如果有一个时刻不满足上面的条件了,就重新开始计算。直到扫到的序列长度到达了
最后还有一个结论:
对于最优方案,不管从什么地方断开,结果一样。
因此只要找到一个合法序列我们就直接进行计算,输出结果即可。复杂度
T3
傻逼大样例还我 AC!!!!!!!!!
我们考虑设
现在考虑怎样转移。我们考虑从
那么现在问题就在于要计算出第一轮双方不同决策概率。由于双方可以无限投,所以需要利用等比数列求和来做,最后求出的概率如下:
- 当两人都想投正面时:
- 当
先手时: 拿到这枚石子的概率为 。 拿到这枚石子的概率为 。
- 当
先手时: 拿到这枚石子的概率为 。 拿到这枚石子的概率为 。
- 当
- 当两人都想投反面时:
- 当
先手时: 拿到这枚石子的概率为 。 拿到这枚石子的概率为 。
- 当
先手时: 拿到这枚石子的概率为 。 拿到这枚石子的概率为 。
- 当
然后根据这个就能列出转移方程,此时暴力做是
发现如果没有
时间复杂度
T4
考虑到本题中积水的大小和左右两边柱子的最大值都有关系,因此考虑拆开来做。设
接下来考虑转移,我们使用刷表法。
-
假设
:那么显然
抹或不抹没有区别,因此 和 都加上相应值即可。 -
假设
。此时抹不抹就有区别了。抹的时候还是转移到
,但是不抹的时候应该转移到 。
但是发现
我们再对反向的序列再做一遍 dp,得出
最后考虑答案。我们枚举剩下的柱子中最高的柱子,然后将两边的方案数乘起来累加即可。注意直接算会算重,因此我们需要规定只有一边可以取等,另一边不行。
50 加塞(vp)
1 得分
题目 | T1 | T2 | T3 | T4 | 总分 |
---|---|---|---|---|---|
得分 |
场外 vp,没有排名。
2 题解
T1
首先模拟样例会发现选择的点是在排序后相邻的,然后发现的确这样选最优。证明不难。
考虑怎么求解,使用 dp,设
注意
T2
策略并不难想,我们从头开始遍历,然后如果当前位置上的值可以更小就删掉。于是有以下策略:
- 如果
,那么显然将 删掉即可。 - 如果
,考虑此时还没有填的最小数 ,显然 要填这个数。自然如果此时 ,那么就要将 删掉。 - 如果
,考虑此时 位置的后缀最小值 ,如果当前要填的数大于 ,就将 删掉即可。
按照这个策略删即可。如果都不满足那么就直接删第
那么我们维护一个当前没有出现的数的集合即可,可以用 set
,复杂度
T3
首先考虑边权不为
我们考虑牛牛的策略什么时候会错。实际上,简单手玩可以发现,我们建出当前点集虚树,如果虚树中有原先点集中没有出现的点的度数大于
我们考虑从后往前删除每一个点,然后按照上面的策略维护关键点。当前仅当关键点数量为
接下来考虑有边权为
边权为
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!