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\) 不变。

我们将所有区间按右端点排序,然后直接贪心即可!

posted @ 2025-08-10 23:48  CuteNess  阅读(7)  评论(0)    收藏  举报