解题思路
容易想到贪心思路,按照区间右值从小到大,将任务排序。然后依次处理每个任务,每次优先选择区间最右边的时间来处理任务,这样可使选择的时间尽量的被后面的区间包含,使能多次利用的时间尽量的多,使总时间最少。
接下来看具体到每个任务的细节如何处理?
对于每一个任务,首先查看这个任务的区间内包含多少已使用的时间,如何计算这个值?
容易发现,前面选择使用的时间区间,一定是由某些不相交的时间段组成,我们可以维护前面选择的时间段,由于这些时间段一定是升序排列,所以我们可以二分查找当前的区间包含哪些已选择的区间,我们可以维护已选择区间的前缀和,进而可以O(1)计算出当前包含区间的和。
我们计算出本区间包含多少个以前选择的区间后,如果已包含的时间不够本区间使用,怎么计算本区间应该最少使用多少时间?
我们可以二分答案,二分本区间使用多少时间,求出本区间最少使用多少时间。
求出本区间使用的时间段以后,如何维护我们前面需要维护的已选择时间段及其前缀和?
三种情况,分类讨论:
1,如果新时间段不和前面的时间段相交,之间加到末尾即可。
2,如果新时间段包含前面的时间段,删除老的时间段即可,显然我们一定是从末尾开始删除,所以我们可以O(1)删除一个时间段
3,如果新时间段与老时间段相交,合并两个时间段即可。
由于最多总共n个时间段,每个时间段只会从末尾添加或者删除,只会添加或者删除一次&