提交时间:2024-12-08 14:18:46

运行 ID: 35266

#include<bits/stdc++.h> using namespace std; #define int long long const int MAXN=5010; int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} int n,m,ans,k,S,num,a[MAXN][MAXN]; struct node{ int a,b,c,d; }p[MAXN]; bool cmpa(node x,node y){return x.a!=y.a?x.a<y.a:x.b<y.b;} bool cmpb(node x,node y){return x.b<y.b;} bool cmpc(node x,node y){return x.c!=y.c?x.c<y.c:x.d<y.d;} struct treearray{ int C[MAXN]; int lb(int x){return x&(-x);} void upd(int x,int y){ for(int i=x;i<=n;i+=lb(i))C[i]+=y;} int qry(int x){ // cout<<x<<endl; x=min(x,n); int res=0;for(int i=x;i>=1;i-=lb(i))res+=C[i];return res;} }T; void slv(){ n=read(),m=read(),k=read(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)S=max(S,a[i][j]=read()); for(int i=1;i<=S;i++)p[i].a=p[i].c=1e9; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) p[a[i][j]].a=min(p[a[i][j]].a,i),p[a[i][j]].b=max(p[a[i][j]].b,i),p[a[i][j]].c=min(p[a[i][j]].c,j),p[a[i][j]].d=max(p[a[i][j]].d,j); for(int i=1;i<=S;i++)while(!p[i].d)swap(p[i],p[S]),S--; sort(p+1,p+S+1,cmpa); for(int i=1;i<=S;i++){ int L=p[i].a,R=0; sort(p+1,p+S+1,cmpb); for(int j=i;j<=S;j++){R=p[j].b; int len=k/(R-L+1); // cout<<" "<<len<<" "<<p[i].a<<" "<<R<<" "<<i<<" "<<j<<endl; for(int o=j-1;o>=i;o--)if(p[o].c>p[o+1].c)swap(p[o],p[o+1]); for(int o=i;o<=j;o++)T.upd(p[o].d,1); for(int o=i;o<=j;o++){ ans=max(ans,T.qry(p[o].c+len-1)); T.upd(p[o].d,-1); } } sort(p+1,p+S+1,cmpa); } printf("%lld",S-ans); } signed main(){ // freopen("1.in","r",stdin);freopen("1.out","w",stdout); slv(); return 0; }