【线段树】洛谷 P4198 楼房重建
2021-03-28 11:15:00
# ACM
解:带修改的查询包含第一个值的$[1,n]$的最长上升子序列(姑且这么叫吧…);
线段树维护节点区间最大值以及区间包含最左值的最长上升子序列,则询问的答案就是根节点的信息
区间最大值$p[rt].maxn$很好维护,主要是维护 区间包含最左值的最长上升子序列 这里记为$p[rt].upcnt$;
显然对于每一个叶子节点($[i,i]$)节点信息就是 { $maxn =$ 本身的值,$upcnt = 1$} ;
更新$p[rt].upcnt$时,左孩子$[l,m]$区间$p[ls].upcnt$都是需要加上的,毕竟是从前往后看,右孩子$[m+1,r]$则需要查找大于左孩子最大值的数目,把左孩子的最大值当作目标然后递归查找;
现在开始递归查找,如果左孩子$[l,m]$的最大值小于等于目标值,那么就去查找右孩子$[m+1,r]$,如果左孩子$[l,m]$的最大值大于目标值,则右孩子的贡献就是 整个区间$[l,r].upcnt -$ 左孩子$[l,m].upcnt +$ 递归左孩子的值;
终点就是当 $l == r$ 时,当前值大于目标值返回 $1$ ,否则 $0$;
1 |
|