제출 #241273

#제출 시각아이디문제언어결과실행 시간메모리
241273aggu_01000101The Kingdom of JOIOI (JOI17_joioi)C++14
60 / 100
4058 ms147400 KiB
#include <bits/stdc++.h> #define int long long #define mid(l, u) ((l+u)/2) #define lchild(i) (i*2 + 1) #define rchild(i) (i*2 + 2) #define INF 100000000000 using namespace std; const int N = 2005; int n, m; int mat[N][N]; pair<int, int> pmm[N][N]; int ourmin, ourmax; int ind[N]; int ans = 0; int mini = 0, maxi = INF; set<int> el; vector<int> dist; void calcpmm(){ for(int i =0 ;i<n;i++){ pmm[i][m-1] = {mat[i][m-1], mat[i][m-1]}; for(int j = m-2;j>=0;j--){ pmm[i][j].first = min(mat[i][j], pmm[i][j+1].first); pmm[i][j].second = max(mat[i][j], pmm[i][j+1].second); } } } int findinrange(int l, int u){ //cout<<endl; //cout<<l<<" "<<u<<endl; /*for(int i = 0;i<n;i++){ for(int j = 0;j<m;j++) cout<<mat[i][j]<<" "; cout<<endl; }*/ int theirmin = INF; int theirmax = -INF; bool canmove = true; for(int i =0 ;i<n;i++){ int j = ind[i]; for (; (j < m) && (mat[i][j] >= l) && (mat[i][j] <= u) && (j<=((i>0)?ind[i-1]:INF)); j++) { ourmin = min(mat[i][j], ourmin); ourmax = max(ourmax, mat[i][j]); ind[i] = j; } if(j<m){ theirmin = min(pmm[i][j].first, theirmin); theirmax = max(pmm[i][j].second, theirmax); } } if(ourmin > ourmax || theirmin > theirmax) return INF; //cout<<theirmax<<" "<<theirmin<<" "<<ourmax<<" "<<ourmin<<endl; //cout<<max(theirmax - theirmin, ourmax - ourmin)<<endl; //cout<<endl; return max(theirmax - theirmin, ourmax - ourmin); } int findans(){ int l = mini; int u = maxi; calcpmm(); int tr = INF; for(int i = 0;i<n;i++) ind[i] = 0; ourmin = INF; ourmax = -INF; for(int k = 0;k<(dist.size()-1);k++){ tr = min(tr, findinrange(l, dist[k])); } for(int i = 0;i<n;i++) ind[i] = 0; ourmin = INF; ourmax = -INF; for(int k = dist.size()-1;k>0;k--){ tr = min(tr, findinrange(dist[k], u)); } return tr; } signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin>>n>>m; int a[n][m]; for(int i =0 ;i<n;i++){ for(int j = 0;j<m;j++) { cin >> mat[i][j]; maxi = max(maxi, mat[i][j]); mini = min(mini, mat[i][j]); a[i][j] = mat[i][j]; el.insert(mat[i][j]); } } for(int j: el) dist.push_back(j); ans = maxi - mini; ans = min(ans, findans()); for(int i = 0;i<n;i++){ for(int j = 0;j<m;j++) mat[i][j] = a[i][m-j-1]; } ans = min(ans, findans()); for(int i = 0;i<n;i++){ for(int j = 0;j<m;j++) mat[i][j] = a[n-i-1][m-j-1]; } ans = min(ans, findans()); for(int i = 0;i<n;i++){ for(int j = 0;j<m;j++) mat[i][j] = a[n-i-1][j]; } ans = min(ans, findans()); cout<<ans<<endl; } /* 4 4 1 12 6 11 11 10 2 14 10 1 9 20 4 17 19 10 8 6 23 23 10 11 16 21 15 26 19 28 19 20 25 26 28 16 15 11 11 8 19 11 15 24 14 19 15 14 24 11 10 8 11 7 6 14 23 5 19 23 17 17 18 11 21 14 20 16 */

컴파일 시 표준 에러 (stderr) 메시지

joioi.cpp: In function 'long long int findinrange(long long int, long long int)':
joioi.cpp:36:10: warning: unused variable 'canmove' [-Wunused-variable]
     bool canmove = true;
          ^~~~~~~
joioi.cpp: In function 'long long int findans()':
joioi.cpp:63:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int k = 0;k<(dist.size()-1);k++){
                   ~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...