DTOJ 4869. 反讽

题意

有两个括号序列 { A n } , { B m } , A i , B i ∈ { \{A_n\},\{B_m\},A_i,B_i\in\{ {An},{Bm},Ai,Bi{(,) } \} },这两个括号序列不一定合法。现在,我们想要归并这两个序列,得到一个新的序列 { C n + m } \{C_{n+m}\} {Cn+m}(所谓归并,就是说每次将 { A } \{A\} {A} { B } \{B\} {B}中的第一个元素删去并加入新序列 { C } \{C\} {C}的末尾,直到 { A } , { B } \{A\},\{B\} {A},{B}均为空)。这样的序列依然可能不合法。我们再在其中插入一些括号,使得 { C } \{C\} {C}合法。你的任务就是找到一种归并方法,使得最后一步中插入的括号最少。

T ≤ 10 , n , m ≤ 1 0 6 T\leq10,n,m\leq10^6 T10,n,m106

题解

把左括号看为 − 1 -1 1,右括号看为 1 1 1,问题在于如何求排成的括号序列的最大的前缀最小值。

注意到这里的限制在于 A A A B B B只能分别顺序取,即限制关系构成两条链。此时应该联想到一个经典问题:有一颗操作树,每次只能选没有父亲的节点,每选一个节点会先减掉 a a a,再加上 b b b,求该过程的最大的前缀最小值。直接套上这个做法即可:按照 a a a b b b的大小关系把节点分为两类,先取 a < a< a<b的,每次取出最优的节点把与父亲合并代表父亲选完之后立即选它,用并查集维护即可。本题中由于值域在 1 e 6 1e6 1e6级别,可以用 v e c t o r vector vector代替堆以省掉一个 l o g log log

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值