hdu3308
给n个数,有m个操作
U a b 表示将第a个数改成b
Q a b 表示询问区间[a,b]的最长连续递增子序列。
区间询问问题且带修改,一般是用线段树来解决
那么要维护
Llen[rt], Lval[rt][2] 表示rt所对应的区间[l,r] 以l开头的最长连续递增子序列的长度, Lval[rt][0]表示子序列的最左边的值,Lval[rt][1]表示子序列最右边的值
Rlen[rt],Rval[rt][2] 表示rt所对应的区间[l,r]以r结尾的最长连续递增子序列的长度, Rval[rt][0] 表示子序列最左边的值,Rval[rt][1]表示子序列最右边的值
Mlen[rt] 表示rt所对应的区间[l,r]最长连续递增子序列的长度
那么Llen[rt] 可能是左区间的Llen[rt<<1] ,也有可能是跨越左右两个孩子
Rlen[rt] 可能是右区间的Rlen[rt<<1|1], 页有可能是跨越左右两个孩子
Mlen[rt] 可能是左区间的Mlen[rt<<1],或者右区间的Mlen[rt<<1|1], 也有可能跨越左右两个区间
上面的状态转移时,也要注意一下val的改变。
具体的转移见代码
同理,最大连续子序列和,和上面的思路差不多
更难一点的题目就是把上述的两个问题放到树上, 那么就要用到树链剖分。