由于是个人总结,可能有一些不全面的地方,还请大佬们不吝赐教
(现在才来总结这些东西,我太菜了)
一、区间贪心
1、选尽量多的不相交区间:按右端点排序,然后选择第一个,删掉与它相交的区间,继续做
2、选最少的点是每个区间都包含k个点:按右端点排序,然后从后往前来选择点
3、选最少的区间使整个大区间被覆盖:按左端点排序,然后选择右端点最远的区间
4、可能还有一些弦图上的东西,算了。。。。
二、排序贪心
这个其实比较简单
先假定所有东西都按最优顺序排好了
然后交换两个东西,就可以得到一个不等式
再按这个不等式排序做就好了
(其实有点像斜率优化的推导,只不过斜率优化用的是两个决策点来比较)
三、配对贪心
有很多这种题,一般只能现场想。。。
但是它有一个原则,就是在满足自身条件的情况下,尽量让其他人配对的代价更小(约等于恰好满足自己的条件)
如:【NOIP2012】疫情控制的第二步贪心,时间机器,NOIP2018 Day1T3 赛道修建。。。。。。
四、异或贪心
1、选一段区间使它们的异或和最大:
本质就是选两个前缀异或和让它们异或起来最大
建一棵01Trie树,然后边查找,边插入,查找就是让当前点和Trie树上的坐标尽量不同(相反方向走)
如果多次查找给定区间中的子区间的最大异或和?不会做了
(感觉可以可持久化Trie树,但是仔细想想就发现有问题)
(感觉可以离线?但是还是有问题吧。。。。)
(我太菜了想不出来)
如果有大佬想到了请在评论区留言。。。
如果还带修改?吐血2333
2、选一个子集让它们的异或和最大:
线性基裸题
如果多次查找给定区间中的子集的最大异或和?套个线段树吧。。。可能复杂了。。。暂时这样做吧反正线性基合并只有logn
大佬博客:区间查询异或最大值——cf1100F,hdu6579 - zsben - 博客园
3、异或最小生成树:
建01Trie树,然后从下往上合并左右子树,要求最小的话,就从左右子树开始尽量往相同的方向走,好像是O(nlogn)。。。
反正看到异或就想Trie树,线性基。。。
五、树上贪心
1、Repulsed:树上最小覆盖贪心(luogu消防局的设立)
2、疫情控制的第一步贪心
3、左偏树贪心:看情况吧。。。。不要乱用。。。。
六、其他贪心
(其实是想不出这种贪心叫什么名字了)
1、排队接水问题:(注意排队的顺序不能改变,且一个人必须连续接完水)
把所有的水龙头中选一个预订时间最小的水龙头,加入当前的人的所需时间,可以线段树优化或用优先队列
如果可以改变排序的顺序,则直接从大到小排序,然后做法同上,可以得到最短时间。
2、电池使用问题:可以扩展为n个电池m个接口,使机器的运转时间最长。
每次二分一个答案mid,则小于mid的电池是可以通过某种方法来填满mid*m的总用电量的
而大于mid电池是永远无法完全利用的,所以它可以用部分只有mid,把这些电量加起来与mid*m比大小即可
当然也有单调队列的做法:F - Distinct Numbers
3、最短时间烙饼问题:假设有n个饼,每个饼总共需要烙ai分钟(可以不连续),锅的最大容量是m,每个时刻可以随意选择烙饼的集合。求最短烙完所有饼的时间。
答案是:max(sum(ai)/m,max(ai))
七、网络流、费用流、模拟费用流
虽然有一些常见的模型,但是大部分建模分析还是得重新推,考场上慢慢想吧。。。(CSP应该不会考吧。。。)