联合省选2021题解
联合省选2021题解
Day1
A.卡牌游戏
一个很显然的思路是枚举最大值和最小值的位置,然后用的时间判断一下是否合法。时间复杂度。
那考虑对这个算法优化,由于的限制显然满足可二分性(我们的策略一定是能不翻就不翻),因此可以考虑枚举最小值位置的同时二分答案,那么我们只需要特殊考虑一下无法通过反转满足要求的边界,找到二分的区间即可。
复杂度
B.矩阵游戏
考虑没有上下界限制的答案那么显然可以钦定矩阵的最左边一列和最上边一行均为,递推计算即可。
考虑的限制,注意到如果对于一行,把第个数加上,为任意整数,那么新的矩阵依然合法。列同理。
那考虑我们给每一行加上一个值,每一列加上一个值,那么我们最后的答案可以写成这个形式
但我们很不喜欢看到这种加和的项,因此考虑隔行取反,这样就可以进行差分约束了。
复杂度
C.图函数
考虑另一个问题:无论有没有对做贡献,我们都将它删去。
那么仔细想想这个题是和原问题等价的,因为如果这个点没有和强联通,那么其他点和强联通的那两条路径上也必不会有(否则设这个点为,显然可以通过走到)。
那考虑最终答案是,那么我枚举,只考虑编号不小于的点,倒序加边,那如果一个和强联通了,设这条路径上编号最小的边编号为,那么点对可以对做贡献。于是差分一下,最后统计一下后缀和即可。
Day2
D.宝石
显然可以用倍增解决。
但上述做法是没有前途的。
考虑
首先可以发现我们要把的路径拆成和
由于互不相同,那么我们可以处理出每个点,设表示向上的第一个宝石为的节点,那我们可以处理出的值,对于的路径暴跳即可,对于的路径我们反着暴跳即可。
现在
上述做法看起来也歇了,但仔细想想是有前途的,我们可以用主席树把空间缩小,那么关键的部分就是我们不能在树上暴跳了。
但我们发现从往上找一个宝石,再从这个点往上找一个,等价于从向上找两个。
那么倍增即可处理的部分。
对于的路径我们可以二分这部分收了多少宝石,然后从反着找这么多宝石,看最后的那个点深度与的关系
时间复杂度
E.滚榜
省选最大诈骗题
因为我们不关心的具体分配方式,因此对于一个全排列我们可以贪心地去分配。给每一个人尽量少的,最后看个题是否够分即可。
时间复杂度,期望得分
虽然上边的那个大暴力得分很高,但是它是没有前途的,看到这个范围其实应该还是给状压的。
由于单调不降,那么如果我这个点分配了一些题,那么后边所有点都要分配至少这么多题。
那么可以考虑维护增量,提前计算贡献,设表示已经选的人的集合为,上一个选的是,已经有的贡献是的可能排名个数,枚举增量和上一个的位置转移即可。
F.支配
支配关系显然形成一棵树,且我们可以用类似于拓扑排序的方法求出支配树。
问题就在于如何处理询问。
注意到一个点的受支配集改变一定是存在一条路径使得他不经过的祖先,进一步的我们发现他一定不经过在支配树上的父亲。那么我们可以考虑处理出每一个点不经过它在支配树上的父亲,能被什么点到达,那么这个就有可能对点做贡献,那么我们处理询问的时候直接树上差分即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】