已完成[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)。
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)。
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 s→xi,容量为 1 1 1,费用为 0 0 0。
x i → T x_i \to T xi→T,容量为 1 1 1,费用为 w w w。
x i → x j ′ ( i > j ) x_i\to x_j'(i>j) xi→xj′(i>j),容量为 1 1 1,费用为 ∣ a i − a j ∣ |a_i-a_j| ∣ai−aj∣。
x i ′ → T x_i'\to T xi′→T,容量为 1 1 1,费用为 0 0 0。
跑最小费用最大流即可,边数 O ( n 2 ) \mathcal O(n^2) O(n2)。
考虑优化,由于限制 i < j i<j i<j 且费用带有绝对值。
考虑 cdq
分治,每次右区间向左区间连边。
首先将区间内权值排序去重,连成一条链,费用为相邻两点之差,将其作为连接左右区间的虚点。
具体地,区间点向虚点连边时,向权值对应链上的位置连边即可,这样就通过累积权值之间的差值实现了费用的绝对值(yytj。
5.P6378 [PA2010] Riddle(紫)
点的状态必然是选或不选,考虑 2-SAT
。
记 x x x 表示选, x ′ x' x′ 表示不选。
对于边的限制,至少一点选,直接 x ′ → y x'\to y x′→y, y ′ → x y'\to x y′→x,表示不选 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 ai→prei, p r e i ′ → a i ′ pre_i'\to a_i' prei′→ai′,表示选 a i a_i ai 前 i i i 个就有关键点。
p r e i − 1 → p r e i pre_{i-1}\to pre_i prei−1→prei, p r e i ′ → p r e i − 1 ′ pre_i'\to pre_{i-1}' prei′→prei−1′,表示前 i − 1 i-1 i−1 个点有关键点那么前 i i i 个点有关键点。
p r e i − 1 → a i ′ pre_{i-1}\to a_i' prei−1→ai′, a i → p r e i − 1 ′ a_i \to pre_{i-1}' ai→prei−1′,表示前 i − 1 i-1 i−1 个点有关键点那么 a i a_i ai 不选。
时间复杂度 O ( n ) \mathcal O(n) O(n)。
6.CF1215F Radio Stations(2700)
2-SAT
。
先看限制一, u , v u,v u,v 至少有一个,连边 u ′ → v , v ′ → u u'\to v,v'\to u u′→v,v′→u 即可。
限制二, u , v u,v u,v 最多有一个,连边 u → v ′ , v → u ′ u\to v',v\to u' u→v′,v→u′ 即可。
限制三,选择的点的区间有交集,记任意一点 f f f,考虑前缀优化建图,记 p r e i pre_i prei 表示 f ≤ i f\leq i f≤i, 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}’ i→preli−1’, i → p r e r i i\to pre_{r_i} i→preri。
p r e l i − 1 → i ′ pre_{l_i-1}\to i' preli−1→i′。
p r e r i ’ → i ′ pre_{r_i}’\to i' preri’→i′。
p r e i → p r e i + 1 pre_i \to pre_{i+1} prei→prei+1。
p r e i + 1 ’ → p r e i ′ pre_{i+1}’\to pre_i' prei+1’→prei′。
最后建图跑 tarjan
即可,时间复杂度
O
(
n
)
\mathcal O(n)
O(n)。
7.CF1007D Ants(3200)
2-SAT
。
考虑如何确定限制,树剖线段树反向记录每条路径对应在线段树上的点,即记录每条边被哪些路径包含,线段树上的叶子节点即为边。
对于一条树边,其被包含的路径编号即为它在线段树上的祖先和它的路径编号并集。
如果选一条路径上,那么它在线段树上的点的祖先和儿子的路径都不能选,即线段树上根到叶子的一条路径上的点的路径编号最多选一个。
考虑线段树上根前缀优化建图,套路了不讲。
时间复杂度 O ( n log 2 n ) \mathcal O(n\log^2 n) O(nlog2n)。
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
lowy→lowx;返租边执行
d
f
n
y
→
l
o
w
x
dfn_y\to low_x
dfny→lowx。
对于树边,每次在线段树上找没有更新 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)。