传送门:D-Remove and append_2022年江西省大学生程序设计竞赛(正式赛) (nowcoder.com)
该题主要考数据结构的熟练程度,对单调栈的理解能力
步入正题
这题主要分两种情况
- k * p < n 的情况
- k * p >= n 的情况
对于第一种情况我们来考虑原数组一定会有 n - k * p 个留下, 此时我们就来考虑如何留下这 n - k * p个数我们得到的答案才是最佳
我们对原数组用单调栈处理,枚举时用 i - top <= k * p 来判断出栈的元素是否以及超过了我们需要处理的数目,未超过继续用单调栈维护递减序列,超过则表示不可在删数
while(top && a[i] > a[b[top]] && i - top <= k * p) top --;
b[++ top] = i;
简单说明:我们需要的是字典序最大的序列,所以我们需要用单调栈维护一个单调递减序列,但是维护的同时我们得保证前面被删的数不超过 k * p,相等了就不需要再维护单调递减,直接把后面数全部压栈,如何保留前 n - k * p 个;
while(n - top < k * p) top --;
剩下的就是对删除