题意:
给定一个矩阵,问最少能用多少次操作使得矩阵有序(类似离散化坐标)
操作一: 修改一个元素的值
操作二:将矩阵的一列上移

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N=1e6+100;
map<int,int>mp;
int main() {
int n,m;
cin>>n>>m;
int a[2*n+1][m+1];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]),a[i+n][j]=a[i][j];
int ans=0;
for(int temp,j=1;j<=m;j++,ans+=temp) {
temp=n;
mp.clear();
for(int i=1;i<=2*n;i++) a[i][j]-=(i-1)*m;
for(int i=1;i<=n;i++) mp[a[i][j]]++;
for(int i=1;i<=n;i++) {
temp=min(temp,i-1+n-mp[j-(i-1)*m]);
--mp[a[i][j]];
++mp[a[i+n][j]];
}
}
cout<<ans;
}
来源:https://www.cnblogs.com/bxd123/p/12232500.html
