loj503
题意
做法一
两维分别维护
考虑求前缀和\(s_i\),有贡献的条件就是\(s_{i-1}\times s_i<0\)
每次都是后缀加上一个值,考虑维护一个集合,集合内存二元组\((min(s_{i-1,s_i}),max(s_{i-1},s_i))\),集合有个tag,表示集合内的值都加上某个值
当集合加入元素的时候,要减去tag
考虑当tag加上delta时的贡献,考虑计算增量,ans-集合内tag的贡献+集合内tag'的贡献,贡献的统计形似\(min(s_{i-1,s_i})<-tag,max(s_{i-1},s_i)>-tag\),线段树维护即可
做法二
不统计\(s_{i-1}\times s_i<0\),统计补集,即\(min(s_{i-1},s_i)\le 0~or~max(s_{i-1},s_i)\ge 0\)(题目保证不会出现\(s_i=0\)的情况)
即我们在做:
插入一个数
删除一个数
将集合内的数加上一个值
查询连续值域内的个数