ABC253F的三种解法

题意

给定 \(n*m\) 的矩阵,初始值为 \(0\) ,有 \(q\) 次操作,分为三种。
\(1\) \(l\) \(r\) \(x\) ,表示对矩阵所有行的 \([l,r]\) 列,加上 \(x\)

\(2\) \(i\) \(x\) ,把第 \(i\) 行整体变为 \(x\)

\(3\) \(i\) \(j\) ,询问 \((i,j)\) 处的值。

\(n,m,q\le 2e5\)

思路一

考虑对一个询问 \(i,j\) 产生贡献的操作是距离当前最近的那一次对于当前 \(i\) 行的 \(2\) 操作和对 \(j\) 列产生影响的 \(1\) 操作,而这需要我们知道那次 \(2\) 操作之前对 \(j\) 列的影响,再用现在的减去,所以建立可持久化线段树即可。、

思路二

这是我赛场上的写法,最后时刻有点小问题没调完\(qwq\)

考虑对一个询问 \(i,j\) 产生贡献的操作是距离当前最近的那一次对于当前 \(i\) 行的 \(2\) 操作和对 \(j\) 列产生影响的 \(1\) 操作,这种类型的题目也见过,一般是考虑离线,询问逆序,这题也不例外。

用到一个学动态规划时学到的技巧,叫做费用提前计算,在列上维护线段树,倒序遍历询问,对于 \(3\) 操作,把询问的列 \(j\) 存在一个标志行的 \(vector\) 中,这样等第一次遇到与这个询问的行相等的 \(2\) 操作,就遍历这个 \(vector\) ,因为那次询问的答案是总的和减去最近这一次已经加上的,这样存储下来之后,就知道了应该在每次 \(2\) 操作查询哪些值,复杂度的话,因为总操作次数是 \(2e5\) ,就算 \(2\) 操作有一重循环提前算费用,那么总次数还是在 \(2e5\) ,所以复杂度是 \(O(qlogm)\)

思路三

考虑对一个询问 \(i,j\) 产生贡献的操作是距离当前最近的那一次对于当前 \(i\) 行的 \(2\) 操作和对 \(j\) 列产生影响的 \(1\) 操作,就是查询一个形式是 \(a\le b,c\le d\) 的区间和,使用二维偏序解决

posted @ 2022-05-29 19:56  Constant1227  阅读(179)  评论(0)    收藏  举报