题目链接:https://www.luogu.com.cn/problem/P4447
很容易想到排序后离散化。
比如: -1 0 0 1 1 2
这样的序列可以离散化为:
编号:1 2 3 4
ai: -1 0 1 2
cs: 1 2 2 1
ai记录的是它原来的能力值,cs对应的是每个能力值的人数。
首先,可以知道的是,只有连续的一串能力值能被分在一组,所以如果出现 1 2 3 6 7 这样的,很容易知道需要将123和67分开处理。
那么就是要解决,如果是连续的能力值,如何使分组人数最少的那组人数最多。
很容易有一种感受是,我们希望一组尽量长,但是又不能太长。
拿上面的例子举例 -1 0 0 1 1 2,如果最长那就是-1 0 1 2,但如果这样选了之后,0 1就被剩下了,剩下的0 1就是人数最少的组,最终答案是2。但如果我们稍微选短一点-1 0 1剩下的就是 0 1 2,答案就是3.
映射到cs数组上就是维护一个不下降序列,第一次是1 2 2,长度为3,在将选的人拿出以后剩下0 1 1 1,第二个不下降序列就是1 1 1(因为是维护不下降序列,出现cs为零一定是从左往右以此出现的,不可能出现1 0 1 1 1这种情况,所以可以删去前导零),长度为3,选完后,再将选出的人删去ÿ