2020 Multi-University Training Contest 8 B
有N个权值,每个权值只能是{-1, 0, 1}中的一个,然后现在分成几段区间,每一段的长度在[L, R]之间,每一个段的权值为:
- >0时候,权值=1
- <0时候,权值=-1
- =0时候,权值=0
现在,要求这几个段的∑之和最大值。
可以列出dp方程,
简单的说,我们可以看成三种情况,我们维护一个前缀和,然后维护这样的三种情况:
- 时候,
- 时候,
- 时候,
分别讨论三种情况,然后求出对应的最大值即可。
所以,我们可以维护一棵权值线段树,然后我们插入这样的到对应的权值的点上去,之后就可以用上面的方法维护了。但是要注意的是,当一个点有多个进入的时候,我们需要进行处理,这里可以维护一个单调递减的单调队列/栈来进行这样的操作。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include