其他分享
首页 > 其他分享> > CF1294E Obtain a Permutation

CF1294E Obtain a Permutation

作者:互联网

https://www.luogu.com.cn/problem/CF1294E

按列考虑,先对于列中每个找当哪一个为第一个时,这个恰好摆放正确。

即 \(a_{i,j}=(i-1)*m+j\),记 \(qwq=(a-j)/m\),则当第一个在 \(i-qwq\),时这个摆放正确,或者考虑 \(qwq=n-x+i,x=n-qwq+i\),然后枚举第一个就好了。

注意判下是否值在这列,不仅仅判是否等差数列当中,还要判是否前 \(n\) 项。

#include <bits/stdc++.h>
#define int long long
#define pb push_back
using namespace std;
#define ID(X,Y) ((X-1)*m+Y)
const int N=(int)(2e5+5);
int n,m,a[N],ans[N];
signed main() {
	cin.tie(0); ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=m;j++) {
			cin>>a[ID(i,j)];
		}
	}
	int answ=0;
	for(int i=1;i<=m;i++) {
		for(int j=0;j<=n;j++) ans[j]=0;
		for(int j=1;j<=n;j++) {
			if((a[ID(j,i)]-1)%m!=i-1) continue ;
			int qwq=(a[ID(j,i)]-i)/m;
			if(qwq>=n) continue ;
			if(j-qwq>=1) ++ans[j-qwq];
			if(1<=n+j-qwq&&j<=n+j-qwq&&n+j-qwq<=n) ++ans[n+j-qwq];
		}
		// a=(j-1)*m+i
		// (j-1)=n-x+i
		int res=(int)(2e9);
		for(int j=1;j<=n;j++) {
			res=min(res,j-1+n-ans[j]);
		}
//		cout<<res<<'\n';
		answ+=res;
	}
	cout<<answ;
	return 0;
}


标签:int,ans,Obtain,long,cin,Permutation,CF1294E,qwq,define
来源: https://www.cnblogs.com/xugangfan/p/16474377.html