本文涉及知识点

C++贪心

一,选择最多不相交区间

将若干区间区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#算法划分N组,每组任意两个元素都符合区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#区间贪心_02。求N组最多能包括多少区间。M=v.size()

N==1:贪心

v按区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#最多不相交区间_03升序排序。
性质一:一定存在最优解,包括v[0]。否则将v[i1]替换成v[0]也是最优解。旧方案包括v[i1],且i1最小。
实现:如果v[0]能选择则选择,不能选择则抛弃。删除v[0]后,持续迭代,直到v为空。iMax已经选择的最大值,如果区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#c++_04,则无法选择。
时间复杂度:O(MlogM),瓶颈在排序。

N组,最多不相交区间

和N==1类似。sGroupEnd记录 N组的最后一个元素的最大值,初始N个INT_MIN。
如果sGroupEnd的全部元素都大于等于v[0]的左端点s0,则抛弃v[0]。
否则 it= sGroupEnd.upper(e0)。 --it就是最优解。
性质二区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#区间选点_05。方案一:s0放到e1后,则右端点为区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#c++_06。方案二:s0放到e2后,则右端点为区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#最多不相交区间_07。由于区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#区间贪心_08,故方案二,优于方案一。
时间复杂度:O(MlogM)

样例:
【区间贪心】P1607 USACO09FEB Fair Shuttle G|省选-

二,N个区间选点。

每个区间至少需要M个点,总点数最少

v按区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#最多不相交区间_03升序排序。setHas记录已有值,对于每个v[i],统计符合的点数,如果<M,从大到小增加点。时间复杂度:O(NMlogNM)

样例:
【区间贪心 决策包容性】757. 设置交集大小至少为|2348

每个区间一个不同的点

每位同学都有自己的期望的座位区间,一个座位只能坐一个同学。从小到大枚举座位,如果有多个同学期望此座位,选择区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#最多不相交区间_03小的。

【区间贪心】B4160 BCSP-X 2024 12 月小学高年级组 排座位|普及+
【区间贪心】P3661 USACO17FEB Why Did the Cow Cross the Road I S|普及+

三,区间合并

性质一区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#区间选点_11 两个区间是否有交集 区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#最多不相交区间_12 区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#区间选点_13。必要性无需证明,下面证明充分性。
令x是两个区间的交点,如果区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#c++_14,得证。否则区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#区间贪心_15,x–也是交点。区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#c++_16
如果能合并,则新区间为区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#区间贪心_17
推论一:如果区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#算法_18也符合性质一。

实现

区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#区间贪心_19为第一关键字,区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#最多不相交区间_03为第二关键字,升序排序。已经处理完v[区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#最多不相交区间_21]合并后的最后一个区间为区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#最多不相交区间_22,则v[i]只会和区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#最多不相交区间_22相交,不会和其它区间相交。比如:区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#算法_24,即区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#区间选点_25
时间复杂度:O(nlogn)

【区间贪心】P2434 SDOI2005 区间合并|普及

四,区间覆盖

区间[1,M]任意点必须被至少一个区间覆盖,求最少区间数。从1到M枚举m,如果没有区间包括m,无合法方案。否则取区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#算法_26最大。

【区间贪心】P1668 [USACO04DEC] Cleaning Shifts S|普及+

五,区间分组

最多不相交区间类似,不同之处:所有区间都必须选择,求最小组数。
性质一:能追加到已有分组,则追加到已有分组不劣于增加新的分组。令区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#算法_27。追加相当于:区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#c++_28。增加新组相当于:区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组_#区间贪心_29。显然追加不劣于增加新组。
样例:
【区间贪心】P4873 USACO14DEC Cow Jog G|省选-

其它

【C++ 二分查找 区间贪心】2271. 毯子覆盖的最多白色砖块数|2021
【C++ 区间贪心】P9344 去年天气旧亭台|普及