CF1458C

这是昨天字节跳动 div. 1 的 C。当时打完比赛我还在骂,这场比赛 BC difficulty gap 怎么这么大,亏了我先看 C 再看 B。但是最后发现这其实并不涉及到没学过的东西,而且很多人都做出来了,所以菜是原罪……


注意到 RLDU 和 IC 根本就不是一个性质的,很难一起在矩阵上面搞。我们考虑,初始的每个格子显然都对答案矩阵的恰好一个格子做出贡献,那么我们考虑拆开它们,考虑每个单个格子对答案矩阵的贡献。

我们考虑把一个格子看成三元组 ((i,j,a_{i,j}))。那么 RL 是在 (j) 上面增减,DU 是在 (i) 上面增减,IC 则是交换第一三或二三维。我们考虑对一开始的 (n^2) 个三元组每个分别维护这 (m) 次操作。优化点在于,将操作转化为这种抽象的事情之后,变得可合并了,即先后若干个操作可以压缩到一个新的 (mathrm O(1)) 的操作(这个套路类似于矩乘,还有之前某次洛谷月赛的 D2D),来用压缩操作的时间换取对所有元素做这么多次操作的时间。

那么我们维护这些操作合并起来是什么样子。每个三元组可能某一维会被增加,可能某两维会被交换。那么我们维护原先的每一维被加了多少,然后现在跑到了哪个位置上了即可。什么都是 (mathrm O(1)) 的。

code

珍爱生命,远离抄袭!
原文地址:https://www.cnblogs.com/ycx-akioi/p/solution-cf1458c.html