CF1809D Binary String Sorting
简要题意
给定一个 $01$ 串,要求你交换相邻两个数或删掉一个数,使得该串单调不降。其中交换相邻两个数的代价是 $10^{12}$,删除的代价是 $10^{12} + 1$,求最小代价。
策略分析
本题需要我们发现一个重要的性质,因为我们需要把数列变成形如 00000...11111 的形式,所以必然存在一个分界点,这个分解点的两边的数可能是 $10$ 或 $01$。现在假设我们知道这个分界点在哪里了,那么我们就要把分界点左边的 $1$ 想办法弄到右边,或者直接扔掉。我们发现,除非是 $10$ 情况下的分界点左边的那个 $1$,其余的 $1$ 删掉的代价一定比一次一次交换过来少,因为删除只需要一次,而交换至少需要两次,显然 $2 \times 10^{12} > 10^{12} + 1$,处理分界点右边的 $0$ 同理。那么我们只需要枚举这个分界点在哪里,并判断分界点两边的数是 $10$ 还是 $01$ 即可,如果是 $10$ 还要额外判断一下转更优还是不转更优,顺序枚举一遍即可得解。
具体来讲,我们对于每个位置,预处理出其前面(包括自己在内)有多少个 $1$,后面有多少个 $0$,枚举到每一个位置的时候用预处理出的值乘以代价即可,注意预处理的前后缀数组要多组数据清空。
时间复杂度 $O(Tn)$。
参考代码
1 |
|
说些什么吧!