hdu 3308 LCIS (线段树)

来源:互联网 发布:淘宝企业店铺是c店吗 编辑:程序博客网 时间:2024/05/21 20:21

题意不难理解   就是求某一区间的最长连续递增子序列。

虽然猜测是线段树做法,但是之前没见过类似题目。    所以搜了下解题报告。


对于某一区间 ,我们保存以从该区最左边点为起点的最长子序列长度,和以该区间最右边的点为终点的最长子序列,以及该区间的最长子序列。

 

对于中点mid 如果a[mid]>=a[mid+1] 断开 那么有左边最长=左儿子左边最长 右边最长=右儿子右边最长 全局最长=Max(两个儿子的全局最长)

 

如果是连起来的a[mid]<a[mid+1] 那么在以上基础上更新 如果左边最长=左儿子长度(表示左半全不是最长递增子序列) 那么左边最长+=右儿子左边最长 同理如果右边最长=右儿子长度 那么右边最长+=左儿子右边最长

 

同时用左儿子右边最长+右儿子左边最长更新全局最长(中间连起来的)

 

最后查询的时候也有一点需要注意。

 

如果  对于某一区间   s<=mid &&e>mid  而且满足 a[mid]<a[mid+1]

中间长度并不是   左儿子右边最长+右儿子左边最长

该长度为   min(mid - s +1,tree[(i<<1)].mr)  + min(e-mid,tree[(i<<1)|1].ml)

 


 

 

原创粉丝点击