题意简述
有一个$n$行$m$列的矩阵$a$,每次你可以做两个操作:
- 改变某一个元素的值
- 对某一列做一次循环位移
然后你要使得每个i,j满足$a[i][j]=(i-1)\times n+j$。问最少需要多少次操作
$n\times m<=2e5$,元素值域为$[1,2e5]$
思路框架
列之间显然是不影响的。考虑每列单独出来考虑。接下来都是在列里面讨论问题的。
像这种问“循环位移需要多少次操作”的题目,一般要设一个数组$move[i]$表示移动$i$次能有多少匹配。这个很好处理,对于每个数,我们找到它应该在哪个位置,和它实际所在的位置相减去绝对值,设为$d$。那么$move[d]$++。其原因是,当前的这个数移动$d$次就到了它该在的地方,所以就给$move[d]$贡献了一个答案。$O(n)$就能预处理一遍。
然后我们枚举移动了多少下。移动$i$下之后,花费$i$的代价,能匹配上$move[i]$个。但是还剩下$n-move[i]$个,就需要用操作$1$来直接修改,花费的代价就是$n-move[i]$。
总代价就是$i+n-move[i]$。然后枚举$i$从$1$到$n$,取最小即珂。
每一列都这样求一遍答案,把答案加起来,就是总答案了。
代码
1 |
|