【CF833E】Caramel Clouds
题面
洛谷
题目大意:
天上有\(n\)朵云,每朵云\(i\)会在时间\([li,ri]\)出现,你有\(C\)个糖果,你可以花费\(c_i\)个糖果让云\(i\)消失,同时需要保证你最多让两朵云消失.现在有\(m\)个独立的询问,每次给你一个需要让阳光照\(k\)时间的植
物,问你从时刻\(0\)开始,这个植物最快什么时候能长成.
\(n,m\leq 3e5\)
题解
这题好神仙啊。。。
我们首先记几个东西:
\(Free:\)表示当前空着的长度和
\(single[x]:\)表示只有\(x\)覆盖的长度
\(opt[x]:\)选出的两朵云中必定包含\(x\)的最大长度
\(Top:\)\(opt\)的最大值
\(cross[x][y]:\)表示只有\(x,y\)覆盖的长度
然后用一个\(set\)维护当前还未消失的云
分类讨论一下\(set\)中云的个数:
1、当\(set\)中没有云时,直接让\(Free\)加上贡献即可
2、当\(set\)中只有一朵云,更新\(single\)以及\(opt\)
3、当\(set\)中有两朵云,更新\(cross\)、\(opt\)
4、当\(set\)中云朵数大于二,不用管,因为此时一定不会比云朵数小于等于二的时候答案更优
至于更新的方法,看代码应该能看懂
#include
#include
#include
#include
#include
#include
#include
#include