看了半天题目才意识到子序列sequence和子串substring不同,前者不连续,后者须连续。
线段树的每一个节点可以维护四种子序列的和:奇数下标开头,奇数下标结尾的子序列之和;奇数下标开头,偶数下标结尾的子序列之和;偶数下标开头,奇数下标结尾的子序列之和;偶数下标开头,偶数下标结尾的子序列之和。
这里面的更新操作只有点修改,所以不涉及父节点的值改变影响子节点的问题,所以不需要PushDown。
for PushUp,因为子序列不连续且可以有负数,所以当前节点的最优值可以是Merge(lson,rson),lson,rson,-INF。
区间查询需要返回一个对象,如果仅仅返回当前节点的最大值,可能在之后因为奇偶下标的限制与相邻节点的子序列无法合并。
区间查询分三种case,lson和rson对应的子序列再合并,lson对应的子序列,rson对应的子序列。之前一直TLE就是因为没有把这三个case分开。如果是普通的求和直接相加就可以,但是涉及到子序列合并,需要分开考虑。模板题结果还卡了这么久><
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include