题目链接:
[SDOI2019]快速查询
对于整个序列维护一个标记$(k,b)$表示序列的每个数的真实值为$k*a_{i}+b$(注意要实时维护$k$的逆元),并记录序列的和。
对于单点修改,将$a_{i}$修改为$val$,因为有序列标记,所以实际修改成$\frac{val-b}{k}$并开一个栈将这个位置压入栈中。
对于序列加和序列乘操作,直接修改标记与序列和即可,注意修改$k$时也要修改$b$。
对于序列赋值操作,将$k$赋成$0$,将$b$赋成$val$(即将操作看成先序列赋成$0$再序列加)并将之前压入栈中的数都弹出并清零(因为只有栈中的数和其他的不一样)。
查询时返回之前记录的值即可。因为每次单点修改只会进栈和出栈一次,所以可以保证序列赋值的时间复杂度。
#include
#include