E. Obtain a Permutation
我们显然可以按列来看
对于每一列 我们发现我们求的就是一个模式串与模板串的最大匹配+位移贡献
因为模板串肯定是不同元素 我们直接 对于模式串的每个元素算出它距离模板串自己的位置的位移贡献 开个桶就可以了
最后要注意的就是判断(a[j][i]-i-1)/m不能大于n了 不然在这一行根本没这么大的数
int Mod(int x,int P){return (x%P+P)%P;}
void solve(){
int n,m;cin>>n>>m;
vector<int>a[n];
for(int i=0;i<n;i++)a[i].resize(m);
for(int i=0;i<n;i++)for(int j=0;j<m;j++)cin>>a[i][j];
int ans=0;
for(int i=0;i<m;i++){
vector<int>v(n);
for(int j=0;j<n;j++){
if((a[j][i]-i-1)%m)continue;
else if((a[j][i]-i-1)/m<n)v[Mod(j-((a[j][i]-i-1)/m),n)]++;
}
int mx=-INF;
for(int j=0;j<n;j++)
mx=max(mx,v[j]-j);
ans+=n-mx;
}
cout<<ans<<endl;
}
标签:int,Codeforces,615,Div,Round,模板
From: https://www.cnblogs.com/ycllz/p/16923547.html