文章目录
Description
Solution
Part 1: 抽象为树上问题并初步解决
首先,我们对括号序列建出一棵树。接着,我们尝试将两种操作转化为树上的操作。
定义位置 i i i 的匹配点 p i p_i pi 为与第 i i i 个括号匹配的括号的位置,则考虑每一个满足 s i = s_i= si=
(的 i i i 对应的 [ i , p i ] [i,p_i] [i,pi],那么这些区间两两要么不相交,要么有包含关系,我们就对这些区间建出一棵森林来,使得区间 A 包含区间 B 当且仅当 A 是 B 的祖先。特别的,如果建出的是一棵森林而不是一棵树,那么我们添加一个根,并将各个森林的根连到这里就好了(等价于加入区间 [ 0 , n + 1 ] [0,n+1] [0,n+1])。
先考虑一操作,令 (A),(B) 对应的两个节点分别是 u , v u,v u,v。首先,一个显然的观察是, u , v u,v u,v 必然是某个点的两个连续的儿子。接着,注意到操作结束后, v v v 对应的区间会变为 p(A)(B)q 中 A 与 B 之间的 (),而 u u u 对应的区间会由原先的 (A) 扩展到整个 (A()B),所以该操作在树上体现为——将 v v v 挂到 u u u 上(即钦定 v v v 的父亲节点为 u u u),然后再将 v v v 的各个儿子挂到 u u u 上。
再考虑二操作。同样地令涉及到的两个节点分别为 u , v u,v u,v。那么很显然的, u , v u,v u,v 也必然是某个点的连续两个儿子;而该操作在树上就体现为,交换 u , v u,v u,v 的顺序。从而,根据操作二,我们可以任意打乱树上任意点的任意儿子之间的顺序,于是接下来,我们就再也不需要考虑顺序的问题了。
从而,问题转化为: 给定一棵树,点带权,每次你可以选定任意两个点 u , v u,v u,v,在满足 u , v u,v u,v 的父亲相同的前提下,以 x w u + y w v xw_u+yw_v xwu+ywv 的代价将 v v v 及其儿子先后分别挂到 u u u 处。你需要求出,最少需要多少的代价才能将树修改成一条从根出发的链。
不难发现,我们可以自浅而深地对树进行操作,每次从该层中选出一个特殊点,并将当前层的除特殊点以外的所有节点全部通过若干次一操作下放到下一层,挂到特殊点的各个子树上。因此,问题的关键在于:对于每一层,如何选出最优的特殊点,以及如何安排 ⌈ \lceil ⌈ 最优的将该层的非特殊点下放到特殊点子树的 ⌋ \rfloor ⌋ 方案。
自浅而深地枚举每一层。令当前层上各个节点按点权从小到大排序后分别为 a 1 , a 2 , ⋯ , a k a_1,a_2,\cdots,a_k a1,a2,⋯,ak。下面,我们分类讨论 ( x , y ) = ( 0 , 1 ) , ( x , y ) = ( 1 , 0 ) , ( x , y ) = ( 1 , 1 ) (x,y)=(0,1),(x,y)=(1,0),(x,y)=(1,1) (x,y)=(0,1),(x,y)=(1,0),(x,y)=(1,1) 的情况( ( x , y ) = ( 0 , 0 ) (x,y)=(0,0) (x,y)=(0,0) 时答案显然为 0 0 0)。
Part 2: x=0,y=1
贪心地保留 a k a_k ak 即可。此时代价为 ∑ i = 1 k − 1 w a i \sum_{i=1}^{k-1} w_{a_i} ∑i=1k−1wai,然后将 a 1 , a 2 , ⋯ , a k − 1 a_1,a_2,\cdots,a_{k-1} a1,a2,⋯,ak−1 下放即可。
为了让时间复杂度正确,我们可以使用 multiset 维护。具体来说,我们预先用若干个 vector 存下每层中所有点的点权,然后建立一个初始为空的 mutiset。接着,我们从深度为 1 1 1(根节点的深度为 0 0 0)出发, 一直往更深处枚举,每次先在 multiset 中加入当前层,每次删去 multiset 中权值最大的点即可。注意,在此过程中,还要维护 multiset 中各个点的权值和。
时间复杂度线性对数。
Part 3: x=1,y=1
首先考虑,将 a 1 , a 2 , ⋯ , a k a_1,a_2,\cdots,a_k a1,a2,⋯,ak 合并到一起,每次以二者点权之和的代价合并时总代价的下界。不难发现,这个下界就是 ∑ i = 2 k ( w a 1 + w a i ) \sum_{i=2}^k (w_{a_1}+w_{a_i}) ∑i=2k(wa1+wai)。
假设选出了特殊点 a t a_t at,则分成两类考虑:
- 若 t = 1 t=1 t=1,那么 a t a_t at 就是该层点权最小的节点,将其他节点合并过来即可,此时总代价达到下界。
- 若 t ≠ 1 t \neq 1 t=1,那么我们可以将 a 2 , a 3 , ⋯ , a t − 1 , a t + 1 , a t + 2 , ⋯ , a k a_2,a_3,\cdots,a_{t-1},a_{t+1},a_{t+2},\cdots,a_k a2</

本文探讨了将括号序列转化为树结构,通过树操作解决匹配点分配问题。针对不同(x,y)组合,提出贪心策略和优化方法,解决x=0,y=1的贪心选择、x=1,y=1的合并策略及x=1,y=0的复杂分析,最终给出线性时间复杂度解决方案。
最低0.47元/天 解锁文章
1714

被折叠的 条评论
为什么被折叠?



