题目链接:http://hihocoder.com/problemset/problem/1384
n个数分成至少多少段,使得每段中最大和最小的m对数之差不大于k?
这是一道很nice的题目,来自《算法竞赛进阶指南》P38.
考虑区间长度L,当然希望L越大越好,因为每段中最大和最小的m对数之差随着L递增,因此可以这样贪心。
于是倍增L,每次暴力check区间是否满足条件,复杂度是$Nlog^2N$,成功被卡。
考虑区间[l, r]和(r, r+p]的关系,我们每次必然会给(r, r+p]排序,但是[l, r]没有影响,只是最后判断[l, r+p]是否满足会影响到区间的长度,一旦判断可以继续扩大那么这个区间就不会再动了,因此这段区间是可以有序的。因此拆成[l, r]和(r, r+p]两段,每次对(r, r+p]排序,判断ok再与之前的区间merge即可。
1 |
|