#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> ii; typedef pair<int,ii> pii; const int inf=0x3f3f3f3f; const int N=3e2+20; vector<ii> v[N*N]; int n,m,p,a[N][N],f[N][N]; int dis(int x,int y,int a,int b) { return abs(x-a)+abs(y-b); } int *ans; void init() { for(int i=0;i<=n*m;i++) v[i].clear(); memset(f,inf,sizeof(f)); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&a[i][j]),v[a[i][j]].push_back(ii(i,j)); if(a[i][j]==1) f[i][j]=dis(1,1,i,j); if(a[i][j]==p) ans=&f[i][j]; } } } queue<ii> q; int dx[]={-1,1,0,0},w[N][N]; int dy[]={0,0,-1,1}; void bfs(int dep) { memset(w,inf,sizeof(w)); for(int i=0;i<v[dep].size();i++) { int x=v[dep][i].first,y=v[dep][i].second; q.push(v[dep][i]); w[x][y]=f[x][y]; } while(!q.empty()) { ii t=q.front(); q.pop(); int x=t.first,y=t.second,dis=w[x][y]; for(int i=0;i<4;i++) { int c=x+dx[i],d=y+dy[i]; if(c>=1&&c<=n&&d>=1&&d<=m) { if(w[c][d]>dis+1) { w[c][d]=dis+1; if(a[c][d]==dep+1) f[c][d]=dis+1; q.push(ii(c,d)); } } } } } void solve() { for(int k=2;k<=p;k++) { if(v[k-1].size()*v[k].size()<n*m) { for(int i=0;i<v[k-1].size();i++) { for(int j=0;j<v[k].size();j++) { int x=v[k][j].first,y=v[k][j].second; int c=v[k-1][i].first,d=v[k-1][i].second; f[x][y]=min(f[x][y],f[c][d]+dis(x,y,c,d)); } } } else bfs(k-1); } printf("%d\n",*ans); } int main() { while(cin>>n>>m>>p) { init(); solve(); } return 0; }
proof:
a+b>=2sqrt(ab)
2mn=2*sum(cnt[x]) >=((cnt[1]+cnt[2])+(cnt[2]+cnt[3])...)>=2sqrt(cnt[i]*cnt[i+1])(i=1..p-1)
cnt[i]*c[i+1]>=mn的,最多sqrt(mn)对
proof
cnt[x]*cnt[x+1]<n*m min(cnt[x],cnt[x+1])*max(cnt[x]*cnt[x+1]) <n*m
得 min(cnt[x],cnt[x+1])<sqrt(nm)
sum(cnt[x]*cnt[x+1])<=sqrt(nm)*(max(cnt[x],cnt[x+1])+max(cnt[x+1],cnt[x+2])...)
sum(cnt[x]*cnt[x+1])<=sqrt(nm)*nm
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。