Submission #29468

#TimeUsernameProblemLanguageResultExecution timeMemory
29468PrOAhMeTThe Kingdom of JOIOI (JOI17_joioi)C++14
100 / 100
3976 ms111948 KiB
#include <bits/stdc++.h> #define mp make_pair #define pb push_back #define pii pair<int,int> #define LL long long #define st first #define nd second #define endl '\n' using namespace std; const int MAXN=2005; int a[MAXN][MAXN],n,m,ans=1e9,mx,mn,idx,l,r,add,mnn,b[MAXN][MAXN],used[MAXN*MAXN],rr; int kk[MAXN][MAXN]; pair<int,pii> c[MAXN*MAXN]; void rotate1() { //cout<<"fuk"<<endl; for(int i=0;i<n;++i) for(int j=0;j<m;++j) { b[i][m-j-1]=a[i][j]; } for(int i=0;i<n;++i) for(int j=0;j<m;++j) { a[i][j]=b[i][j]; } for(int i=0;i<n;++i) for(int j=0;j<m;++j) { b[i][m-j-1]=kk[i][j]; } for(int i=0;i<n;++i) for(int j=0;j<m;++j) { kk[i][j]=b[i][j]; } } void rotate2() { for(int i=0;i<n;++i) for(int j=0;j<m;++j) { b[n-i-1][j]=a[i][j]; } for(int i=0;i<n;++i) for(int j=0;j<m;++j) { a[i][j]=b[i][j]; } for(int i=0;i<n;++i) for(int j=0;j<m;++j) { b[n-i-1][j]=kk[i][j]; } for(int i=0;i<n;++i) for(int j=0;j<m;++j) { kk[i][j]=b[i][j]; } } int solve() { memset(used,0,sizeof used); /*for(int i=0;i<n;++i) { for(int j=0;j<m;++j) { cout<<a[i][j]<<" "; } cout<<endl; }*/ l=0,r=n*m-1; int ret=1e9; int x,y; mn=1e9+1; for(int i=0;i<n;++i) for(int j=0;j<m;++j) { if(mn>a[i][j]) { mn=a[i][j]; x=i; y=j; } } //cout<<"xd"<<endl; mx=0; //cout<<x<<" "<<y<<" "<<mpp.size()<<endl; int up[MAXN]; int cnt=0; memset(up,0,sizeof up); for(int j=0;j<=x;++j) { up[j]=y+1; for(int i=0;i<=y;++i) { mx=max(mx,a[j][i]); used[kk[j][i]]=1; while(l!=r&&used[l]) ++l; while(l!=r&&used[r]) --r; ++cnt; } } priority_queue<pii> pq; for(int i=0;i<n;++i) { if(up[i]!=m) { if(i&&up[i]==up[i-1]) continue; pq.push(mp(-a[i][up[i]],i)); } } if(!pq.empty()) ret=min(ret,max(mx-mn,c[r].st-c[l].st)); //cout<<"xd"<<endl; pii dd; int val; while(!pq.empty()) { add=-1,mnn=1e9+1; dd=pq.top(); pq.pop(); add=dd.nd; val=-dd.st; mx=max(mx,val); used[kk[add][up[add]]]=1; while(l!=r&&used[l]) ++l; while(l!=r&&used[r]) --r; ++up[add]; if(up[add]!=m) { if(add!=0&&up[add]==up[add-1]); else pq.push(mp(-a[add][up[add]],add)); } if(add+1!=n&&up[add+1]==up[add]-1) pq.push(mp(-a[add+1][up[add+1]],add+1)); if(!pq.empty()) ret=min(ret,max(mx-mn,c[r].st-c[l].st)); } //cout<<"rekt"<<endl; return ret; } int main() { srand(time(NULL)); scanf("%d %d",&n,&m); for(int i=0;i<n;++i) for(int j=0;j<m;++j) { scanf("%d",&a[i][j]); c[i*m+j]=mp(a[i][j],mp(i,j)); } sort(c,c+n*m); for(int i=0;i<n*m;++i) kk[c[i].nd.st][c[i].nd.nd]=i; if(rand()%13!=2) ans=min(ans,solve()); rotate1(); //cout<<"malahmet"<<endl; if(rand()%13!=2) ans=min(ans,solve()); rotate2(); if(rand()%13!=2) ans=min(ans,solve()); rotate1(); if(rand()%13!=2) ans=min(ans,solve()); printf("%d\n",ans); }

Compilation message (stderr)

joioi.cpp: In function 'int main()':
joioi.cpp:139:22: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d",&n,&m);
                      ^
joioi.cpp:142:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%d",&a[i][j]);
                        ^
joioi.cpp: In function 'int solve()':
joioi.cpp:70:8: warning: 'y' may be used uninitialized in this function [-Wmaybe-uninitialized]
  int x,y;
        ^
joioi.cpp:86:15: warning: 'x' may be used uninitialized in this function [-Wmaybe-uninitialized]
  for(int j=0;j<=x;++j) {
               ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...