The 2024 CCPC Shandong Invitational Contest and Provincial Collegiate Programming Contest
C. Colorful Segments 2
考虑最小的分组数量,可以先按左端点排序,然后每次贪心地找到前面一个最大右端点 的组加入。
考虑计数,还是同样地按左端点排序,那么假设现在有 个组,每个组最大右端点是 (没有元素则 ),那么每次可以选择一个 的组并且把 更新为 。注意到我们不需要关心具体的 ,只用关心 的数量。由于 是单增的,所以所有 的组 本质相同。那么就是每次查询 的数量,并且将其减 ,并插入一个 ,可以用堆模拟。复杂度 。
E. Sensors
由于恰好有 个点的线段是有用的,且每个点不会被重新加入,那不妨考虑每次删除点的时候快速找到所有从 个变成 个的线段,和从 个变成 个的线段。
从 个变成 个是好维护的,只需要把 个的线段插入到那个点的 vector 中,删除的时候直接减去所有的贡献即可。
从 个变成 个时,线段的左右端点恰好跨越一个点。设当前剩下的点坐标是 那么不妨用一个 multiset 维护每个 的 ,删除 时直接把 合并到 ,并访问 和 最大的 更新即可。复杂度 。
考虑更优秀的复杂度,把每个线段插入到线段树上的 个节点,然后对于每个线段维护它所在的所有节点中点个数 的节点个数,当更新一个节点 时,若 就访问所有这个节点上的线段更新即可。复杂度 。
G. Cosmic Travel
差分转化为 的第 大和,那么套路地枚举 和 的 lcp 下一位,在 trie 上模拟前这些位(若这一位是 ,则先看 ,不够就到 ),然后拆成 个询问一个子树异或任意数(不能超过这个子树能表示的最大数)的第 大和。注意到这个东西是与询问无关的,设 为 子树异或任意数的第 大和,状态数量为 的(每个叶子统计 次)。
这里为了方便,可以把和设为只看子树里的这些位的和,类似地模拟转移即可。
复杂度 。
L. Intersection of Paths
考虑对于一个 ,有那些点可能成为并的一个端点,考虑每一条边 ,如果删掉这条边后 这条边就合法,那么 就合法。那么假如不考虑更改边的话,答案就是只取这些点组成的虚树(一定是原树的一个联通块)的直径。
考虑 不同,并且加入更改边,由于大的 对应联通块一定被小 对应的完全包含,那么可以直径从小到大扫描线,每次从 时,把 的边删掉(更改边权为 )。
那么就是要实现动态修改边权,查询直径。考虑在欧拉序上做,每次遍历到 在 dfs 序后加入 ,遍历 的 每个 儿子回来后再加入 。然后就是要找到一个区间 的 ,其中 肯定是 中 最小那个。于是线段树上维护区间信息 对应上述答案、、,最大和最小 。合并时 ,。
显然支持修改,复杂度 。
本文作者:FantasyNumber
本文链接:https://www.cnblogs.com/MiniLong/p/18447323
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)