近五年的APIO
[APIO2018] 铁人两项
题意:给定一个张图,询问其中有多少个有序三元组
考虑建出原图的圆方树。可以在圆方树上进行树形DP,分别对于圆点和方点的情况讨论即可。
复杂度可以做到
[APIO2018] 选圆圈
题意:图中有
感觉这个东西并不好数据结构维护,所以考虑暴力。
首先记当前最大的圆为
这样的构造使用哈希可以做到单次
但是这样的方格在做到足够大的时候是不优的,所以我们要考虑当前最长的半径
[APIO2018] 新家
题意:有
使用二分答案,题目转化为判断一个区间内是否有所有
对于每一个商店,维护他前一个的与它种类相同的店的位置,如果
[APIO2019] 桥梁
题意:给定一张图,边有边权,支持两种操作:修改一条边的边权,查询从某个点开始只经过边权
对操作序列进行分块,每次读入
计算时间复杂度,单次处理,复杂度为
[APIO2019] 奇怪装置
题意:对于整数
由于
由于
原题转化为询问原来的所有区间,有多少本质不同的
[APIO2019] 路灯
题意:有一个长为
维护原序列中的极长 set
维护(其实就和ODT很像)。
则 set
中每一个
使用线段树套动态开点线段树实现矩阵加,单点查,时间复杂度
[APIO2020] 粉刷墙壁
题意:现在有一面分为若干块墙壁,每一块需要被刷成特定的颜色,现在有若干家公司,每一家公司刷特定的几个颜色,每一次操作选择和公司数等量的墙壁,按照从某家公司开始顺序各刷一面墙,每一个公司只会刷这个公司特定的颜色。问至少进行多少次操作才能把墙刷完。
如果我们知道了从每一个位置开始能否将连续的
接下来考虑通过DP来维护答案。
记
所以
同时注意到,每一种颜色的公司很少,所以可以考虑每一次DP是更新所有的可以刷当前位置的公司即可,时间复杂度
[APIO2020] 交换城市
题意:给定一张有边权的无向图,有两个人分别在不同的两个点,求在所有让两个人交换位置且不相遇的方案中,经过所有边的边权最大值的最小值是多少。
通过手玩或者证明,不难得到,两个点之间不能够相互到达,当且仅当他们两个点所在的连通块是一条链。
而我们维护的东西很像最小生成树,所以考虑类似的从小到大加入边,同时建出 Kruskal 重构树。
如果一条边破坏了某条链,就将它向链上所有的点连边;同时,他如果连接了两个非链连通块(包括连接了之后不是链的),它也会将这两个连通块连接在一起。
使用启发式合并维护加边过程,树剖实现重构树上求答案即可。
时间复杂度
[APIO2020] 有趣的旅途
题意:给定一个每个点度数
首先假设我们知道了树的形态,我们要如何构造答案。
一个很简单的想法就是我们会围绕着一个点打转,同时逐渐靠近这个点。
那么如果我们选择的这个点度数为
但是,这样交替我们就必须要保证
这样,我们就可以把这种构造方法推广到度数为
现在我再回头来考虑如何找到重心。
由于重心满足每一个子树的大小
我们在花
接下来直接实现上述过程即可。
[APIO2021] 六边形领域
[APIO2021] 雨林跳跃
题意:给定一个
我们很容易用倍增
我们考虑贪心,首先,最优的路径不可能在过程中回到
然后这个点的路径必然是向上跳(即向左右两边中更高的跳)一段,然后向右跳一段。
使用倍增实现,时间复杂度
[APIO2021] 封闭道路
题意:给定一个有
首先,考虑对于特定的
我们考虑降低复杂度。对于一个度数为
所以,我们考虑求解
使用可删除堆维护,复杂度为
[APIO2022] 火星
[APIO2022] 游戏
题意:给定一张有向图,初始时有一条
来自水军的神秘做法。
由于初始时有从
但是维护
[APIO2022] 排列
题意:构造一个排列,是的其递增子序列数为给定的
考虑一个长为
这样对于
发现我们有很多的点都在做同一件事情:使得递增子序列数
这样序列最长为
考虑继续优化。
如果同时出现
如果蓝色和橙色的点分别对应
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下