【bzoj4426】最大生产率 题解

题目大意

  有 n 个工人,每个工人的工作时间为 l[i]…r[i]。
  你要把工人分成 p 个组,每个组的贡献是该组工人的 min(r)-max(l),即工作时间的交集。
  你的分组要保证每组的贡献是正数,且每个人都要有分组。
  求最大总贡献。
  p<=n<=1000(原题是 200), l, r<=1e6, 保证有解。

题解

  看到这个首先想到把工人按时间排个序,然后发现连续一段分一组好像是坠吼的??
  如果出现一个工人包含了另一个工人的情况,这样就错了。

  所以要把工人分成两类,一类是不包含任何其它工人的,一类是会包含其他工人的。
  那么第一类工人按时间排序之后,连续一段分一组就最优了。讲道理这就是个简单dp了,用四边形不等式可以优化到 n^2,这个跟 poj1160 差不多。
  讲道理第二类工人本来也应该这样dp一下的,但是。。。首先这类人不满足连续一段分一组最优的性质,其次他们贪心就行了。。。一个人独占一组肯定是最优的,因此这一类人按工作时长排序,从大到小选就好了,选不到的就相当于把他扔到第一类去找他包含的那组。
  (这也可以理解为什么第一类人不能贪心,因为他们选不到的不能被扔到别的地方去)

  最后就是枚举两类人各分成多少组就行了。