为什么会变成这样呢? #3(并查集维护区间)

给定长度为 \(n\) 的字符串 \(S\) 以及 \(m\) 个区间 \([l_i, r_i]\),记 \(T=S[l_1,r_1]+\cdots+S[l_m,r_m]\),其中 \(S[x,y]\) 表示从第 \(x\) 个字符到第 \(y\) 个字符的子串。求如何重新排列 \(S\) 中字符的顺序使得 \(T\) 的字典序尽可能大。

期望复杂度: 近似 \(O(n)\)

czy's trick

\(S\) 中的每个位置有一个重要度,例如位置 \(l_1\) 是最重要的,应当放 \(S\) 中最大的字符,其次是 \(l_1+1,\dots,r_1,l_2,\dots\) 这些位置,且区间重复的部分以第一次出现为准。

相当于原问题变为了一个区间覆盖问题,我们只要以较快的速度跳过已经覆盖的区间即可。我们可以使用并查集维护区间,每个点对应并查集中的元素,在并查集合并的时候总是以较大的数作为父亲,则一个点的代表元就是其所在区间的右端点。

结合计数排序即可做到 \(O(n\alpha(n))\) 的时间复杂度。

例题:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值