CF1294E Obtain a Permutation

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

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

ai,j=(i1)m+j,记 qwq=(aj)/m,则当第一个在 iqwq,时这个摆放正确,或者考虑 qwq=nx+i,x=nqwq+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; }

__EOF__

本文作者F x o r G
本文链接https://www.cnblogs.com/xugangfan/p/16474377.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   FxorG  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示