Submission #837899

#TimeUsernameProblemLanguageResultExecution timeMemory
837899thimote75Quality Of Living (IOI10_quality)C++14
100 / 100
1497 ms175488 KiB
#include "quality.h"

#include <bits/stdc++.h>
using namespace std;

using idata = vector<int>;
using igrid = vector<idata>;

igrid VC;

bool check (int R, int C, int H, int W, igrid &V, int M) {
	int count = (H * W + 1) >> 1;

	for (int i = 0; i <= R; i ++)
		VC[i][0] = 0;
	for (int i = 0; i <= C; i ++)
		VC[0][i] = 0;

	for (int i = 1; i <= R; i ++) {
		for (int j = 1; j <= C; j ++) {
			VC[i][j] = VC[i - 1][j]
			         + VC[i][j - 1]
					 - VC[i - 1][j - 1]
					 + (V[i - 1][j - 1] <= M ? 1 : 0);
		}
	}

	for (int i = 0; i + H <= R; i ++) {
		for (int j = 0; j + W <= C; j ++) {
			int lc = VC[i][j] + VC[i + H][j + W]
			      - (VC[i + H][j] + VC[i][j + W]);
			
			if (lc >= count) return true;
		}
	}

	return false;
}

int rectangle(int R, int C, int H, int W, int Q[3001][3001]) {
	VC.resize(R + 1, idata(C + 1));
	igrid V(R, idata(C));
	for (int i = 0; i < R; i ++)
		for (int j = 0; j < C; j ++)
			V[i][j] = Q[i][j];
	
	int a = 0;
	int b = R * C;

	while (b - a > 1) {
		int c = (a + b) >> 1;

		if (check(R, C, H, W, V, c)) b = c;
		else a = c;
	}

	return b;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...