Submission #1132327

#TimeUsernameProblemLanguageResultExecution timeMemory
1132327henriessThe Kingdom of JOIOI (JOI17_joioi)C++20
0 / 100
0 ms320 KiB
#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;


vector<vector<long long>> grid;
vector<pair<long long,long long>> moves = {{0,-1},{0,1},{-1,0},{1,0}};

long long h,w;

multiset<long long> ogvals;

bool is_valid_split(const vector<vector<bool>>& vis) {
    // Check row connectivity
    for (int i = 0; i < h; ++i) {
        bool in_region = false;
        for (int j = 0; j < w; ++j) {
            if (vis[i][j]) {
                if (!in_region) in_region = true;
            } else {
                if (in_region) return false; // Non-contiguous JOI region in row
            }
        }
    }

    // Check column connectivity
    for (int j = 0; j < w; ++j) {
        bool in_region = false;
        for (int i = 0; i < h; ++i) {
            if (vis[i][j]) {
                if (!in_region) in_region = true;
            } else {
                if (in_region) return false; // Non-contiguous JOI region in column
            }
        }
    }

    return true;
}


long long bfs(long long mid){
	multiset<long long> vals = ogvals;
	queue<pair<pair<long long,long long>,pair<long long,long long>>> nodes;

	long long first = grid[0][0];
	long long iteration = 0;
	nodes.push({{0,0},{first,iteration}});
	vals.erase(first);
	
	vector<vector<bool>> vis;
	vis.resize(h,vector<bool>(w,false));
	vis[0][0] = true;
	long long minjoi = first;
	long long maxjoi = first;
	while (!nodes.empty()){
		long long cr = nodes.front().first.first;
		long long cc = nodes.front().first.second;
		long long cval = nodes.front().second.first;
		long long citer = nodes.front().second.second;
		nodes.pop();
		for(auto move : moves){
			long long nr = cr + move.first;
			long long nc = cc + move.second;
			if (nr >= 0 && nr < h && nc >= 0 && nc < w && vis[nr][nc] != true){
				long long newval = grid[nr][nc];
				
			
				long long new_minjoi = min(minjoi, newval);
				long long new_maxjoi = max(maxjoi, newval);
				long long difference = new_maxjoi - new_minjoi;

				if (difference <= mid) {
					// Valid node for JOI region
					minjoi = new_minjoi;
					maxjoi = new_maxjoi;
					vis[nr][nc] = true;
					nodes.push({{nr, nc}, {newval, citer + 1}});
				}

				//else if (difference == mid){
					//auto it = prev(vals.end());
					//auto it2 = vals.begin();
					//long long maxdiff = *it - *it2;
					//nodes.push({{nr,nc},{newval,citer + 1}});
					//return max(difference,maxdiff);
				//}
				
				
			}
			
		}
	}
	//for(int i = 0;i<h;i++){
		
		//bool x = true;
		//for(int j = 0;j<w;j++){
			//if (vis[i][0] == true && vis[i][w-1] == true && vis[i][j] == false && j != w-1){
				//return 1e9;
			//}
			//if (vis[i][w-1] == false && vis[i][0] == false && vis[i][j] == true && j != 0){
				//return 1e9;
			//}
			
			//if (vis[0][j] == true && vis[h-1][j] == true && vis[i][j] == false && i != h-1){
				//return 1e9;
			//}
			//if (vis[h-1][j] == false && vis[0][j] == false && vis[i][j] == true && i != 0){
				//return 1e9;
			//}
		//}
	//}
	if (!is_valid_split(vis)) return 1e9;
	long long minioi = LLONG_MAX, maxioi = LLONG_MIN;
    for (int i = 0; i < h; ++i) {
        for (int j = 0; j < w; ++j) {
            if (!vis[i][j]) {
                minioi = min(minioi, grid[i][j]);
                maxioi = max(maxioi, grid[i][j]);
            }
        }
    }
    cout << maxioi << ' ' << minioi << '\n';
	//if (!vals.empty()) {
		//auto it = prev(vals.end());
		//auto it2 = vals.begin();
		//long long maxdiff = abs(*it - *it2);
		//cout << difference << ' ' << maxdiff << '\n';
		//return max(difference, maxdiff);
	//}
	//cout << difference << '\n';
	if (minioi == LLONG_MAX && maxioi == LLONG_MIN) {
   
		return 1e9;
	}
	else if (minioi == LLONG_MAX && maxioi != LLONG_MIN){
		return max(maxjoi - minjoi,0LL);
	}
	else if (minioi != LLONG_MAX && maxioi == LLONG_MIN){
		return max(maxjoi - minjoi, 0LL);
	}
	return max(maxjoi - minjoi, maxioi - minioi);

}

bool check(long long mid){
	
	long long r = bfs(mid);
	return r <= mid;
}
void bsearch(){
	long long lb = 0;
	long long ub = 1e9;
	long long mid = -1;
	long long res = -1;
	while (lb <= ub){
		mid = (lb + ub) / 2;
		if (check(mid)){
			res = mid;
			ub = mid - 1;
		}
		else{
			lb = mid + 1;
		}
	}
	cout << res;
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
	
	cin >> h >> w;
	grid.resize(h,vector<long long>(w));

	
	for(int i = 0;i<h;i++){
		for(int j = 0;j<w;j++){
			long long alt;cin >> alt;
			grid[i][j] = alt;
			ogvals.insert(alt);
		}
	}
	
	bsearch();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...