序列

发布时间 2023-12-31 23:33:23作者: 最爱丁珰

我们先想最暴力的解法,就是一个一个修改并且保存每一个历史时刻各个位置的值,然后询问的时候查询历史时刻的这个位置

如果我们把每一个历史时刻的序列都并列写上,就会像这个样子

其中这个坐标系的每一个点代表序列中某个位置在某个时间的真实的值

然后我们就会发现修改操作变成了一个矩阵,查询操作是一条线段(实际上也是一个矩阵)

其中绿色的是查询,橙色的修改,某个位置在某个时间点的真实值就是原来的值加上所有橙色矩阵对其的影响

那么这种多个矩阵修改叠加影响的一定要想到扫描线!

对于一个修改操作,我们在二维平面上\(x=l\)处添加一个三元组\((0,x,i)\),其中\(0\)表示修改操作,\(x\)\(l\)表示扫描线上\([l,q]\)这个区间的值加上\(x\),同时在\(x=r+1\)处添加一个三元组\((0,-x,i)\),意义类似(注意一定是在\(x=r+1\)处而不是\(x=r\)处!细节注意!)

对于一个查询操作,我们在二维平面上\(x=p\)处添加一个三元组\((1,y,i)\),其中\(1\)表示查询操作,\(y\)\(i\)表示查询扫描线上\([0,i-1]\)这个区间上(加上序列最开始的值)不小于\(y\)的数的个数

这个时刻我们就要想到动态查询第\(k\)小这个模型,用分块处理即可

但是注意一个细节,暴力统计的时候一定要整个块都遍历,因为此时已经排了序了,块内的点可能不满足二维偏序了