제출 #386376

#제출 시각아이디문제언어결과실행 시간메모리
386376ritul_kr_singhThe Kingdom of JOIOI (JOI17_joioi)C++17
100 / 100
1897 ms70580 KiB
#pragma GCC optimize("Ofast,unroll-loops") #include <bits/stdc++.h> using namespace std; // #define int long long #define nl << '\n' #define sp << ' ' << int h, w; int g[2000][2000], a[2000], b[2000], maxElement, minElement; bool possible(int diff){ int res0 = 0, res1 = 0; for(int i=0; i<h; ++i){ a[i] = 0; for(int j=0; j<w; ++j){ if(g[i][j]-minElement<=diff) ++a[i]; else break; } b[i] = a[i]; a[i] = min(a[i], a[i-1]); } for(int i=h-2; i>=0; --i) b[i] = min(b[i], b[i+1]); for(int i=0; i<h; ++i){ for(int j=a[i]; j<w; ++j) res0 = max(res0, maxElement - g[i][j]); for(int j=b[i]; j<w; ++j) res1 = max(res1, maxElement - g[i][j]); } return (res0<=diff or res1<=diff); } int search(){ int res = maxElement - minElement; int low = 0, high = res; while(low<high){ int mid = (low+high)/2; if(possible(mid)) high = mid; else low = mid+1; } if(!possible(low)) return res; return low; } void rotate(){ int g0[h][w]; for(int i=0; i<h; ++i) for(int j=0; j<w; ++j) g0[i][j] = g[i][j]; swap(h, w); for(int i=0; i<h; ++i) for(int j=0; j<w; ++j) g[i][j] = g0[j][h-1-i]; } signed main(){ cin.tie(0)->sync_with_stdio(0); cin >> h >> w; for(int i=0; i<h; ++i) for(int j=0; j<w; ++j) cin >> g[i][j]; int ans = 2e9; maxElement = minElement = g[0][0]; for(int i=0; i<h; ++i) for(int j=0; j<w; ++j) maxElement = max(maxElement, g[i][j]), minElement = min(minElement, g[i][j]); for(int __=0; __<2; ++__){ for(int _=0; _<4; ++_){ if(_) rotate(); ans = min(ans, search()); } for(int i=0; i<h; ++i) for(int j=0; j<w; ++j) g[i][j] = -g[i][j]; swap(maxElement, minElement); maxElement = -maxElement; minElement = -minElement; } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...