DS notes
P4169 [Violet] 天使玩偶/SJY摆棋子
CDQ 分治
如果所有的点都在当前询问点的左下角,就变成求 \(\min\vert X-x_i\vert+\vert Y-y_i\vert\),拆掉绝对值就是 \(X+Y-\max\{x_i+y_i\}\),可以用 BIT 求前缀 \(\max\)。然后又要求 \(x_i\le X \wedge y_i\le Y\),二维偏序,所以想到用 cdq 分治。先对 \(x\) 排序,再用 BIT,每次处理 \(l\sim mid\) 的修改对于 \(mid+1\sim r\) 的查询的贡献,也就是用上面说的前缀 \(\max\),再分治下去就行。
具体地,每次计算的时候,要分别计算在四个方向上(左上左下右上右下,可以近似看成四个象限)的贡献,可以将每个点的坐标相应地取反,比如说计算左上就把纵坐标取反,右上就都取反。这样都翻转到了左下角,而且相对距离不变,不过把纵坐标取反了的话要记得加上一个偏移量,因为要加到 BIT 里面。
P8990 [北大集训 2021] 小明的树
线段树巧妙应用
下文称点亮为白点,未点亮为黑点。
首先来说,一棵树是美丽的,是一些子树全为白点的情况,换言之也就是所有黑点连通。那么这里有一个套路,或者说技巧,就是:
点数 \(-\) 边数 \(=\) 连通块数量
考虑维护每个时刻黑点连通块数量,记为 \(c_i\)。每个时刻的黑点数量是确定的,为 \(n-i\),但是两端都为黑点的边数未知。不过初值为 \(n-1\),所以将 \(c_i\) 初始化为 \(1-i\)。
之后考虑一条边,其两端点为 \(u\),\(v\),被点亮的时间分别为 \(b_u\) 和 \(b_v\)(方便起见设前者较小)。特别地,\(b_1=n\)。那么一条边就会对 \(c_{b_u}\sim c_{n-1}\) 做出 \(1\) 的贡献。
于是我们就需要计算所有 \(c_i=1\) 的答案之和。设这个答案为 \(v_i\),显然 \(v_i=\) 当前时刻两端点颜色不同的边数,注意前提是 \(c_i=1\)。然后还是考虑一条边,发现它能对 \(v_{b_u}\sim v_{b_v}-1\) 做出 \(1\) 的贡献。
显然这个是区间修改,线段树即可。又因为 \(c_i\ge1\),即 \(1\) 是最小值,那么再维护区间 \(c_i\) 最小值和对应的 \(v_i\) 即可。
差点忘了还有修改操作/lh,我们只需要把一条边原来的贡献删去,添加新的贡献即可。时间复杂度 \(\mathcal{O}((n+q)\log n)\)。
pushup
的时候记得记录当前节点有几个最小值组成。
P9058 [Ynoi2004] rpmtdq
点分治,扫描线,BIT
路径问题,考虑点分治。
考虑如何计算跨过当前分治中心的点对。暴力统计所有点对上界是 \(\mathcal{O}(n^2)\) 的,这里面一定有很多无效点对,所以我们只需要找出有效点对即可。
设 \(d_i\) 表示点 \(i\) 到当前 \(rt\) 的距离,\((i,j)\) 是有效点对,而 \((i,k)\),\((k,j)\) 均无效(\(i<k<j\)),则有 :
所以,若 \((i,j)\) 有效,则 \(\max(d_i,d_j)<\min\limits_{k=i+1}^{j-1}d_k\)。直观点来看,若把 \(d_i\) 看成矩形高度,一个点的匹配点最多只有 \(2\) 个,所以点对数是 \(\mathcal{O}(n\log n)\) 的,每一层的点对可以用单调栈线性求出,总复杂度就是 \(\mathcal{O}(n\log n)\)。但是实现的过程中我只想到每层用一次 sort
的实现方法,所以就是 \(\mathcal{O}(n\log^2n)\)。
接着还得计算答案。既然没有强制在线,可以使用扫描线,维护答案序列 \(c\)。对于每一个点对,扫到 \(j\) 时 \(c_i=\min(c_i,d_i+d_j)\)(或者应该可以扫到 \(i\) 时修改 \(j\))。对于询问,扫到 \(r\) 时,查询 \(\min\limits_{p=l}^rc_p\)。单点 \(\min\) 和后缀 \(\min\),树状数组即可。(可以从二维平面角度思考,感觉更一般,更普遍性)
扫描线一共有 \(\mathcal{O}(n\log n)\) 次修改,\(q\) 次询问,复杂度 \(\mathcal{O}(n\log^2n+q\log n)\)。
另外会发现我们分治时并没有考虑在同一棵子树内的情况,因为这并不会让答案变劣。如果一个在同一棵子树内的点对被考虑到了,首先这不是简单路径,所以肯定会被下一层分治排除掉。此外被这个错误路径排掉的点对显然更劣,我们取的都是最小值,所以不影响。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现