题意:一个多重集合的价值为将其变为公差为ddd(将在第一行输入)的等差数列需要插入几个数字(无法实现价值为0)。多次询问l,rl,rl,r,求[l,r][l,r][l,r]的子区间的价值和。
序列长度3e53e53e5,数字大小和d≤1e7d\leq 1e7d≤1e7
首先对于r′>rr'>rr′>r,lll使得[l,r][l,r][l,r]是最长的可以实现的区间,l′l'l′是使得[l′,r′][l',r'][l′,r′]是最长的可以实现的区间,那么l′≥ll' \geq ll′≥l,所以我们可以用双指针扫一遍求出所有可以实现的区间在哪些区间内。
那么对于所有可以实现的区间,我们有一个简单的方法可以计算一个区间[l,r][l,r][l,r]构成的集合的价值:
最大值d−最小值d+l−r\frac {最大值}d - \frac {最小值}d + l - rd最大值−d最小值+l−r
然后就是很套路的在双指针的同时维护两个单调栈,在栈中发生插入和删除操作的同时在线段树上区间加减。
那么如果我们问的是[l,r][l,r][l,r]的价值,离线后就是双指针右端点到达rrr时,单点查询lll.
如果问的是∑i=lr[i,r]\sum_{i=l}^r [i,r]∑i=lr[i