提交时间:2024-12-08 14:19:00
运行 ID: 35268
#include<bits/stdc++.h> #define pii pair<int,int> #define fi first #define se second #define mk make_pair using namespace std; const int N=5050; struct segtree{ int T[N<<2],tg[N<<2]; #define ls p*2 #define rs p*2+1 #define mid (l+r)/2 void pu(int p){ T[p]=max(T[ls],T[rs]); }void pd(int p){ if(tg[p]==0) return ; tg[ls]+=tg[p]; tg[rs]+=tg[p]; T[ls]+=tg[p]; T[rs]+=tg[p]; tg[p]=0; }void bd(int p,int l,int r){ tg[p]=0; if(l==r){ T[p]=0;return ; }bd(ls,l,mid);bd(rs,mid+1,r);pu(p); }void upd(int p,int l,int r,int pl,int pr,int v){ if(pl>pr) return ; if(pl<=l&&r<=pr){ T[p]+=v;tg[p]+=v;return; }pd(p); if(pl<=mid) upd(ls,l,mid,pl,pr,v); if(pr>mid) upd(rs,mid+1,r,pl,pr,v);pu(p); //cout<<l<<' '<<r<<' '<<T[p]<<endl; } }sgt; vector<int> ea[N],eb[N]; int mnx[N],mxx[N]; int mny[N],mxy[N]; int n,m,S,cnt=0,ans=0; int main(){ freopen("disinfect.in","r",stdin); freopen("disinfect.out","w",stdout); memset(mnx,0x3f,sizeof(mnx));memset(mxx,0,sizeof(mxx)); memset(mny,0x3f,sizeof(mny));memset(mxy,0,sizeof(mxy)); scanf("%d%d%d",&n,&m,&S); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ int x;scanf("%d",&x); if(mxx[x]==0) cnt++; mxx[x]=max(mxx[x],i);mxy[x]=max(mxy[x],j); mnx[x]=min(mnx[x],i);mny[x]=min(mny[x],j); } }for(int i=1;i<=510;i++){ if(mxx[i]==0) continue; ea[mxx[i]].push_back(i); eb[mnx[i]].push_back(i); }for(int len=n;len>=1;len--){ int ol=S/len; if(ol<1||ol>m) continue; //cout<<len<<endl; int L=1,R=0; sgt.bd(1,1,m); while(R<len){ R++; for(auto v:ea[R]){ if(mxx[v]-mnx[v]+1>len) continue; int pl=max(1,mxy[v]-ol+1),pr=min(m-ol+1,mny[v]); //cout<<v<<' '<<pl<<' '<<pr<<endl; sgt.upd(1,1,m,pl,pr,1); } }ans=max(ans,sgt.T[1]); while(R<n){ R++; for(auto v:ea[R]){ if(mxx[v]-mnx[v]+1>len) continue; int pl=max(1,mxy[v]-ol+1),pr=min(m-ol+1,mny[v]); sgt.upd(1,1,m,pl,pr,1); }for(auto v:eb[L]){ if(mxx[v]-mnx[v]+1>len) continue; int pl=max(1,mxy[v]-ol+1),pr=min(m-ol+1,mny[v]); sgt.upd(1,1,m,pl,pr,-1); }L++; ans=max(ans,sgt.T[1]); } } printf("%d",cnt-ans); return 0; }