bzoj3711Druzyny

体育课上,n个小朋友排成一行(从1到n编号),老师想把他们分成若干组,每一组都包含编号连续的一段小朋友,每个小朋友属于且仅属于一个组。
第i个小朋友希望它所在的组的人数不多于d[i],不少于c[i],否则他就会不满意。
在所有小朋友都满意的前提下,求可以分成的组的数目的最大值,以及有多少种分组方案能达到最大值。

 

朴素dp方程并不难,dp[i]表示到第i个人正好划分成dp[i]组,可以从一定范围内满足条件的j(j<i)通过dp[i]=max(dp[j-1]+1)得到

这样的复杂度是n^3

可以用分治优化dp

每层分治(以solve(l,r)表示)不能无脑地以中点作为划分

而是要找到一个以l到r C最大的点作为划分点k

先不考虑d的影响,一段区间的选取一定和该区间c最大得值有关,所以这样划分显然是有道理的

我们每层分治的任务就是处理l-->k对k-->r的贡献(此时0到l-1的已经处理过了)

 每次对于i(从max(l+c[k],k)开始),j的取值范围应为l-->min(i-c[k],k-1)

加入上界的限制,随i增大时,j的取值范围也会右移,j的下限还要在i最左能取到的值(可预处理)之右

 

posted @ 2019-02-10 21:10  Mr_Handsome  阅读(162)  评论(0编辑  收藏  举报