倍增并查集
如果你既会倍增,又会并查集,那你一定会倍增并查集吧!
数据范围明示
众所周知,倍增是
先来重新考虑一下倍增的本质。
倍增
倍增最经典的用法是 ST 表。我们将一个区间拆成两个长为
这个做法中最重要的一步是把长区间拆成小区间,并且必须确保两个小区间的和能合并得到大区间的答案,即我们维护的东西需要满足可合并律。即我们将大区间拆成的小区间可以有交,但是其并集必须是原来的大区间。
比如求 lca 时,我们正是根据两点往上跳后的 lca 与原来相同这一性质进行合并。
回到这道题。我们发现对于每个点直接维护一个并查集是
考虑一下怎么维护。对于两个要合并的区间
我们明确一下同属于一个并查集的区间的含义,这代表所有的这些区间都是完全一致的,这就为我们提供了一种可能的下放操作。我们考虑怎么把第
最后,我们看一下第
总结一下,首先对于每个点开
代码写的出奇的顺利,把细节处理好就可以了。
Another Problem
考虑这道题和上一道的联系。显然,除了区间相同的定义不一样和某些点强制不同之外,其它没有区别。
于是想一下怎么变成一样的东西。显然可以将序列复制一遍后倒着接在原序列后面,这样就将大部分问题转换成了刚才的问题。现在考虑如何判断强制不同的点,我们只需判断它们是否位于同一个并查集内即可。
至于输出方案,贪心即可。
但是写了才发现贪心有多难。这里借鉴了 syz 的处理思路,将存在矛盾的集合连边,从头开始对各个位置进行赋值,连边的集合中所有已经赋过值的显然会对当前赋值产生一些限制。具体而言,我们只能贪心的填这些值的
需要注意的细节较多,要将序列前半部分和后半部分的对应点放到同一个集合中,但是不放也能过,感觉是数据水了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现