【icpc2019网络赛南昌站】Yukino With Subinterval
傻b错误调一天系列 原题: 大意:给你一个数列a,字词两种操作: 1.把c[l]改成r 2.询问在区间[l,r]中,有多少个极大子区间满足子区间里的数全部一样,且在[x,y]范围内 (对于满足条件的区间A,若不存在满足条件的区间B使得A包含于B,则称A为极大子区间) 序列问题,要求复杂度O(nlogn),联想cdq分治 值域可以容斥拆成[1,l-1]和[1,r]两个询问,即把询问转化为区间中数小于等于x的数有多少个 可以把初始数列看成0,然后用修改操作代替初始数列 那么现在就存在偏序:若修改A的时间小于询问B,且A的值小于B的值,则A可以给B提供贡献 对于计算贡献,我们建一个线段树,字词单点修改,并查询有多少个不同的非0极大子区间,这个比较好写 初始按时间排序,然后按值域分治 然后这题就做完了马 反例: 6 3 1 1 4 5 1 4 2 1 6 2 5 1 6 1 2 1 6 2 5 上面的做法会输出3 3,正确答案却是3 2 考试的时候我写这个做法然后深度自闭 出错的原因是因为我们按值域分治,那么当第6个数(被视为操作1 6 4)和第三个操作(2 1 6 2 5)分到一个分治区间时,因为操作2(1 6 1)被分到左边的分治区间了,所以不会把代表第6个数的操作覆盖掉,这时第6个数就给第3个操作产生了贡献(尽管第三个操作进行时它已经被覆盖掉了) 更换提供贡献的顺序是不行的