ZROJ #3288. 括号匹配问题
给定两个长度为 \(n\) 的整数序列 \(a, b\),其中 \(0 \leq b_i \leq 1\)。
定义一对 \(i, j\) 可匹配当且仅当 \(i < j\),\(b_i = 0\), \(b_j = 1\)。
定义最优的匹配方案,其满足:
- 每一对匹配的两个元素可匹配,每个元素在至多一对匹配中。
- item 总匹配对数最多。
- 在上述前提下,满足 \(a_i = a_j\) 的匹配对数最多。
求最优匹配方案中 \(a_i = a_j\) 的匹配对数。
每个测试点中有多组数据。
不嫩发现这是一个匹配问题
我们考虑当所有 \(a_i\) 均相等的时候的答案。
我们另取一个序列 \(p\),\(p_i=1-2*b_i\),也就是说 \(b_i\) 是 \(0\),\(p\) 就是 \(1\),否则就是 \(-1\)。
然后我们对这个 \(p\) 做前缀和得到 \(s\)。
最后的答案应该是 \(n\) 减去匹配不上的左括号和右括号。
推导可以得到:
\[ans = {1\over2}(n-s_n)+\min s_i
\]
换句话说,我们的匹配数量只和 \(\min s_i\) 有关,所以只要我们的操作不改变 \(\min s_i\),那么匹配数量就不会改变。
考虑回原题意,我们希望最大化 \(a_i=a_j\) 相同的对数,假如我们钦定 \(x,y\) 这两个位置上的括号必须互相匹配,那么这相当于将这两项从序列中删去,也就是将他们的 \(p_i\) 置零,这相当于将 \(s_x,s_{x+1},\cdots,s_{y-1}\) 全部减去一。
所以,如果我们希望在钦定一些匹配对数来最大化答案,那么这意味这我们在为 \(s\) 上的一些区间减一的同时,要保证 \(\min s_i\) 不变。
我们将所有区间按右端点排序,然后直接贪心即可!
本文来自博客园,作者:CuteNess,转载请注明原文链接:https://www.cnblogs.com/CuteNess/p/19031269

浙公网安备 33010602011771号