优化建图技巧

常见优化建图技巧 习题 题解。

已完成[8/11] 题解[8/11]

1.P5025 [SNOI2017]炸弹(紫)

容易想到每个炸弹向它爆炸范围内的炸弹连边,跑多源搜索,能抵达的节点数量即是答案。

考虑线段树建边优化,线段树内父亲向儿子连边,炸弹向范围区间连边,边数 O ( n log ⁡ n ) \mathcal O(n \log n) O(nlogn) 条。

然后 tarjan 缩点成 DAG,跑搜索记录能到达的最左右端点即可。

时间复杂度 O ( n log ⁡ n ) \mathcal O(n \log n) O(nlogn)

CODE

2.P3588 [POI2015] PUS(紫)

貌似是差分约束。

区间向区间连边,线段树优化建边,建虚点。

具体地,按套路建儿子向父亲连边的线段树,把操作区间分割的最多 k + 1 k+1 k+1 个子区间向虚点连边,虚点向给的 k k k 个点连边,边数 O ( k log ⁡ n ) \mathcal O(k\log n) O(klogn)

接着拓扑跑最长路即可。

对于确定的数,即 dis ⁡ \operatorname{dis} dis 已确定。

时间复杂度 O ( n log ⁡ n ) \mathcal O(n\log n) O(nlogn)

CODE

3.P5471 [NOI2019] 弹跳(紫)

相当于例题加强成二维矩阵。

考虑树套树优化建图,外层线段树,内层动态开点线段树,空间复杂度 O ( n log ⁡ 2 n ) \mathcal O(n\log^2 n) O(nlog2n),边数 O ( m log ⁡ 2 n ) \mathcal O(m\log^2n) O(mlog2n),无法通过。

优化 1 1 1:树套树内层换成 set 空间复杂度 O ( n log ⁡ n ) \mathcal O(n\log n) O(nlogn)

优化 2 2 2:不直接连边,每次从树套树里取出扩展即可,

优化 3 3 3:由于 dij 上每个节点只会被删除和扩展一次,所以取出扩展完删除即可。

时间复杂度 O ( n log ⁡ 2 n ) \mathcal O(n\log^2n) O(nlog2n),空间复杂度 O ( n log ⁡ n ) \mathcal O(n\log n) O(nlogn)

4.P5331 [SNOI2019]通信(黑)

网络流模型:

s → x i s \to x_i sxi,容量为 1 1 1,费用为 0 0 0

x i → T x_i \to T xiT,容量为 1 1 1,费用为 w w w

x i → x j ′ ( i > j ) x_i\to x_j'(i>j) xixj(i>j),容量为 1 1 1,费用为 ∣ a i − a j ∣ |a_i-a_j| aiaj

x i ′ → T x_i'\to T xiT,容量为 1 1 1,费用为 0 0 0

跑最小费用最大流即可,边数 O ( n 2 ) \mathcal O(n^2) O(n2)

考虑优化,由于限制 i < j i<j i<j 且费用带有绝对值。

考虑 cdq 分治,每次右区间向左区间连边。

首先将区间内权值排序去重,连成一条链,费用为相邻两点之差,将其作为连接左右区间的虚点。

具体地,区间点向虚点连边时,向权值对应链上的位置连边即可,这样就通过累积权值之间的差值实现了费用的绝对值(yytj。

CODE

5.P6378 [PA2010] Riddle(紫)

点的状态必然是选或不选,考虑 2-SAT

x x x 表示选, x ′ x' x 表示不选。

对于边的限制,至少一点选,直接 x ′ → y x'\to y xy y ′ → x y'\to x yx,表示不选 x x x 必选 y y y,不选 y y y 必选 x x x

对于部分的限制,一个点向该部分中除它以外的所有点连边,直接连边数是 O ( n 2 ) \mathcal O(n^2) O(n2) 的。

考虑前缀优化建图。

p r e i pre_i prei 表示前 i i i 个点有关键点, p r e i ′ pre_i' prei 表示前 i i i 个点没有关键点。

部分内连边:

a i → p r e i a_i\to pre_i aiprei p r e i ′ → a i ′ pre_i'\to a_i' preiai,表示选 a i a_i ai i i i 个就有关键点。

p r e i − 1 → p r e i pre_{i-1}\to pre_i prei1prei p r e i ′ → p r e i − 1 ′ pre_i'\to pre_{i-1}' preiprei1,表示前 i − 1 i-1 i1 个点有关键点那么前 i i i 个点有关键点。

p r e i − 1 → a i ′ pre_{i-1}\to a_i' prei1ai a i → p r e i − 1 ′ a_i \to pre_{i-1}' aiprei1,表示前 i − 1 i-1 i1 个点有关键点那么 a i a_i ai 不选。

时间复杂度 O ( n ) \mathcal O(n) O(n)

CODE

6.CF1215F Radio Stations(2700)

2-SAT

先看限制一, u , v u,v u,v 至少有一个,连边 u ′ → v , v ′ → u u'\to v,v'\to u uv,vu 即可。

限制二, u , v u,v u,v 最多有一个,连边 u → v ′ , v → u ′ u\to v',v\to u' uv,vu 即可。

限制三,选择的点的区间有交集,记任意一点 f f f,考虑前缀优化建图,记 p r e i pre_i prei 表示 f ≤ i f\leq i fi p r e i ′ pre_i' prei 表示 f > i f>i f>i

连边:

i → p r e l i − 1 ’ i\to pre_{l_i-1}’ ipreli1 i → p r e r i i\to pre_{r_i} ipreri

p r e l i − 1 → i ′ pre_{l_i-1}\to i' preli1i

p r e r i ’ → i ′ pre_{r_i}’\to i' prerii

p r e i → p r e i + 1 pre_i \to pre_{i+1} preiprei+1

p r e i + 1 ’ → p r e i ′ pre_{i+1}’\to pre_i' prei+1prei

最后建图跑 tarjan 即可,时间复杂度 O ( n ) \mathcal O(n) O(n)

CODE

7.CF1007D Ants(3200)

2-SAT

考虑如何确定限制,树剖线段树反向记录每条路径对应在线段树上的点,即记录每条边被哪些路径包含,线段树上的叶子节点即为边。

对于一条树边,其被包含的路径编号即为它在线段树上的祖先和它的路径编号并集。

如果选一条路径上,那么它在线段树上的点的祖先和儿子的路径都不能选,即线段树上根到叶子的一条路径上的点的路径编号最多选一个。

考虑线段树上根前缀优化建图,套路了不讲。

时间复杂度 O ( n log ⁡ 2 n ) \mathcal O(n\log^2 n) O(nlog2n)

CODE

8.P7712 [Ynoi2077] hlcpq(黑)

有暴力, O ( n 2 ) \mathcal O(n ^ 2) O(n2) 建边,tarjan 求割点。

再考虑优化,拿出线段树优化建边过程,考虑到区间限制,扫描线加主席树即可。

然后发现,建虚点会使答案不对,故只构造结构而不建边。

回顾 tarjan 求割点的过程,树边递归完后执行 l o w y → l o w x low_y\to low_x lowylowx;返租边执行 d f n y → l o w x dfn_y\to low_x dfnylowx

对于树边,每次在线段树上找没有更新 d f n dfn dfn 的节点,然后更新 l o w low low 即可。

对于返租边,求出边的 d f n dfn dfn 最小值即可。

时间复杂度均摊 O ( n log ⁡ n ) \mathcal O(n \log n) O(nlogn)

CODE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值