CF1458C - Latin Square 题解

这是昨天字节跳动 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

posted @ 2020-12-20 13:05  ycx060617  阅读(105)  评论(0编辑  收藏  举报