제출 #1161326

#제출 시각아이디문제언어결과실행 시간메모리
1161326NurislamThe Kingdom of JOIOI (JOI17_joioi)C++20
100 / 100
3396 ms94492 KiB
#include <bits/stdc++.h>

using namespace std;


#define int long long
#define pb push_back

int inf = 2e9;

void solve(){
	int n, m;
	cin >> n >> m;
	vector<vector<int>> a(n, vector<int> (m));
	
	array<int,3> mx = {0, 0, 0}, mn = {inf, 0, 0};
	for(int i = 0; i < n; i ++ )
		for(int j = 0; j < m; j ++ ){
			cin >> a[i][j];
			if(mx[0] <= a[i][j]) mx = {a[i][j], i, j};
			if(mn[0] >= a[i][j]) mn = {a[i][j], i, j};
		}
	int l = 0, r = mx[0] - mn[0], ans = r;
	
	//vector<int> dx = {-1,1,0,0}, dy = {0,0,-1,1};
	//auto ok = [&](int i, int j) -> bool {
		//return (i >= 0 && i < n && j >= 0 && j < m);
	//};
	
	auto rota = [&]() {
		vector<vector<int>> na(m, vector<int>(n));
		for(int nj = 0, j = m-1; j >= 0; nj ++, j -- ){
			for(int i = 0; i < n; i ++ )
				na[nj][i] = a[i][j];
		}
		
		a = na;
		swap(n, m);
	};
	
	auto ch = [&]( int mid ) -> bool {
		for(int k = 0; k < 4; k ++ ){
			int la = m-1, cmx = 0;
			for(int i = 0; i < n; i ++ ) {
				for(int j = 0; j < m; j ++ ){
					if(mx[0] - a[i][j] > mid) la = min(la, j-1);
					if(j > la){
						cmx = max(cmx, a[i][j]);
					}
				}
			}
			if(cmx - mn[0] <= mid) return 1;
			rota();
		}
		return 0;
	};
	
	while( l <= r ) {
		int m = (l + r) >> 1;
		if(ch(m)){
			ans = m;
			r = m - 1;
		}else l = m + 1;
	};
	
	cout << ans << '\n';
};

signed main(){
	ios_base::sync_with_stdio();
	cin.tie(nullptr); cout.tie(nullptr);
	int tt = 1;
	//cin >> tt;
	
	while(tt -- ){
		solve();
	};
	
};
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...