题意:
对一个序列有两种操作:
- $1,pos,v,将a_{pos}改成v$
- $2, l, r, x,y,查询[l,r]区间内,连续数字的段有几段,求数字大小在[x,y]间(比如1,2,2,5,6,就有4段为1,(2,2),5,6,在[2,5]就只有2段)$
这题如果提前说了可以用$cdq分治-三维偏序来做$,那就很好理解,但是网络赛中绝大部分使用树套树,就被卡常数,为了巩固下$cdq$就来做了
其实从第二个询问就可以看出来有两个范围之类的东西,不难想到二维偏序,以位置$pos$为$x$轴,以数值$a_{pos}$为$y$轴,这样查询是否就是询问坐标轴以$(l,x)$左下角,$(r,y)$右上角的矩阵中直线的个数,然后我们把直线转换为点,就是个二维偏序问题。
- 需要注意的是,如果第a[l]是连续直线中的一个点,在累计答案时需要+1
再来看修改,也就是可以说就是一个三维偏序的魔改,我们修改时需要规定4点
- 如果这个元素不属于连续的第一个元素,那就不用删除这个点。反之还需要将他前面的点更新成第一个点。
- 如果新添加元素属于连续的第一个元素,那么要新建这个点。反之,还有将他前面的点删除。
代码
1 |
|