标签:int ans Obtain long cin Permutation CF1294E qwq define
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。