[APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树)
[APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树) 题面 略 分析 首先把一组询问(x,y)看成二维平面上的一个点,我们想办法用数据结构维护这个二维平面(注意根据题意这里的y要-1,这样问题变成[x,y]区间是否是由连续的一段1组成) 如果我们改变第x个灯的状态,那么只有原来满足全1的条件,且现在不满足全1条件的区间受到影响。设包含x的最大的连续1的区间为[l,r],则左端点在[l,x],右端点在[x,r]的询问会受到影响。转化到二维平面上,就变成x坐标在[l,x]之内,y坐标在[x,r]之间的点会受到影响。即 左下角为(l,x),右上角为(x,r)的矩形内的点 然后考虑每次修改对答案的影响。假如一个灯在t1时刻被点亮,t2时刻被熄灭,则它对答案的贡献为 \(t_2-t_1\) 。因此,如果时间为i时的修改使得第x个灯被点亮,我们就把左下角为(l,x),右上角为(x,r)的矩形内的点的值-i。如果时间为i时的修改使得第x个灯被熄灭,我们就把左下角为(l,x),右上角为(x,r)的矩形内的点的值+i 对于时间为i的询问(x,y),我们查询点(x,y)的值v,如果当前不能从x到y,那就直接输出v.否则,就输出i+v.因为只有某个灯熄灭的时候我们才更新它的贡献,如果询问时没熄灭,就要加上这些贡献。 这样,我们就把问题转化成二维的 区间修改,单点查询 问题