Submission #378251

#TimeUsernameProblemLanguageResultExecution timeMemory
378251peijarThe Kingdom of JOIOI (JOI17_joioi)C++17
100 / 100
594 ms101884 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 2000;
const int MAXROT = 4;

int altitude[MAXROT][MAXN][MAXN];
int nbLig, nbCol;
int petit(1e9), grand(0);

bool isOk(int iRot, int deltaMax)
{
	int prv(nbCol-1);
	for (int iLig(0); iLig < nbLig; ++iLig)
	{
		int curCol(-1);
		while (curCol + 1 <= prv and altitude[iRot][iLig][curCol+1] <= petit + deltaMax)
			++curCol;
		prv = curCol;
		if (prv == -1 and !iLig)
			return false;
		for (int iCol=curCol+1; iCol < nbCol; ++iCol)
			if (altitude[iRot][iLig][iCol] < grand - deltaMax)
				return false;
	}
	return true;
}

bool can(int delta)
{
	for (int iRot = 0; iRot < MAXROT; ++iRot) 
		if (isOk(iRot, delta))
			return true;
	return false;
}

signed main(void)
{
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	
	cin >> nbLig >> nbCol;
	for (int iLig = 0; iLig < nbLig; ++iLig) 
		for (int iCol = 0; iCol < nbCol; ++iCol) 
			cin >> altitude[0][iLig][iCol];
	for (int iLig = 0; iLig < nbLig; ++iLig) 
		for (int iCol = 0; iCol < nbCol; ++iCol) 
		{
			altitude[1][iLig][iCol] = altitude[0][iLig][nbCol - iCol-1];
			altitude[2][iLig][iCol] = altitude[0][nbLig-iLig-1][iCol];
			altitude[3][iLig][iCol] = altitude[0][nbLig-iLig-1][nbCol-iCol-1];
		}
	for (int iLig = 0; iLig < nbLig; ++iLig) 
		for (int iCol = 0; iCol < nbCol; ++iCol) 
			petit = min(petit, altitude[0][iLig][iCol]),
						grand = max(grand, altitude[0][iLig][iCol]);
	int lo(0), up(1e9);
	while (lo < up)
	{
		int mid = (lo + up)/2;
		if (can(mid))
			up = mid;
		else
			lo = mid + 1;
	}
	cout << lo << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...