各种优化建图(留坑)
一、线段树优化
1.
个点, 个操作:
-
1 u l r w
向区间 的节点连长度为 的边; -
2 u l r w
区间 的节点向 连长度为 的边; -
3 x y l r w
区间 的节点向区间 的节点连长度为 的边。
求 到 的最短路。
- 。
直接暴力连可使边数达到 。
使用线段树优化,将线段树上每一个节点当成这一段区间。
建两颗线段树 和 , 中父亲向儿子连长度为 的边, 中儿子向父亲连长度为 的边,二者共用叶子节点,叶子节点编号为 。
- 向 上构成 的节点连长度为 的边;
- 上构成 的节点向 连长度为 的边;
- 建一个虚点, 上构成 的节点向虚点连长度为 的边,虚点向 上构成 的节点连长度为 的边。
这样可将边数降至 ,点数为 级别,用二叉堆实现的 可做到 。
CF786B Legacy(模板,最短路)Code
2.
(注意 已经排过序了)
对于每一个炸弹,使用 与 算出它能引爆的炸弹编号范围,与上题一样用线段树连边。
随后 缩点,并顺便维护每个强连通分量内能引爆的编号的左右端点 ,那么只要引爆强连通分量内的任意一个节点,这一段区间内都会被引爆,因为强连通分量内部可以全部互相引爆。
最后再对缩点后的图进行 ,当节点 指向节点 时,有
原因是 爆炸可以引爆 。
对于炸弹 ,如果它属于强连通分量 ,则引爆 会导致 个炸弹爆炸。
3.
注意题目规定数的范围是 。
由于 是正整数,所以由
得
这就是一个差分约束了,使用拓扑排序解决(可以判环),首先照抄线段树区间连边( 个大的数将 分成若干段,分段处理,大的与小的分别连虚拟点),然后令 表示节点 的最小值,初始值所有均为 (范围内最小值),如果数已知则为已知值。
当节点 指向节点 时,
无解有 种情况:
- 出现环(用 值判);
- 超出范围;
- 有已知值,但 。
注意最后只判断叶子节点(即节点 ,区间长度为 的节点)。
二、 前后缀优化
1.
个点, 个操作:
1 u l r w
向区间 以外的节点连长度为 的边;2 u l r w
区间 以外的节点向 连长度为 的边;3 x y l r w
区间 以外的节点向区间 以外的节点连长度为 的边。
求 到 的最短路。
- 。
线段树是 的,过不去。
区间 以外 相当于 前缀 与后缀 。
新建 个点 表示前缀 ,再新建 个点 表示后缀 。
从 分别向 和 连长度为 的边,从 分别向 和 连长度为 的边。
- 向 和 连长度为 的边;
- 和 向 连长度为 的边;
- 和 分别向 和 连长度为 的边。
点数为 级别,边数为 级别, 可做到 ,足已通过。
2.
用 解决,每个点有选与不选两种,用 和 表示。
以下连一条边 指连双向边, 符合则 必定符合, 不符合则 必定不符合(在图中连 条边 )。
由于原图中一条边 的两个端点至少选一个,所以要连边 ( 不选则 必选, 不选则 必选),注意不能是 向 连边,因为是 至少 选一个。
代表前缀 的点 表示在该部分中前 个点是否有被选的。
连边:
然后跑 并判断即可。
3.
仍然是 , 和 分别表示电站 开不开。
至少一个就是 ,至多一个则是 。
新建立 个点,分别表示当 取 时 是否成立,记为 。
对于一个电站 ,连边:
跑完 后进行判断无解就不说了。
当 时,说明电站 是开的,电站个数加一;
当 且 时,说明 且 ,那么 就是其中一个满足条件的 ,输出。
最后注意 是不能取 的,处理方法是连边 ,这样保证了 是一定不符合的,否则会出现矛盾。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】