제출 #205861

#제출 시각아이디문제언어결과실행 시간메모리
205861ics0503Cultivation (JOI17_cultivation)C++17
5 / 100
2092 ms504 KiB
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
int n, R, C;
struct xy { int x, y; }a[313];
struct line { int x, ys, ye, pls; };
bool sort_x(line a, line b) { if (a.x != b.x)return a.x < b.x; return a.pls < b.pls; }
int y[121212], val[121212];
bool simulate(int l, int r, int u, int d) {
	int i, j, k, yn = 0;
	vector<line>L;
	for (i = 0; i < n; i++) {
		L.push_back({ a[i].x - l, a[i].y - u, a[i].y + d, 1 });
		L.push_back({ a[i].x + r + 1, a[i].y - u,a[i].y + d,-1 });
		y[yn++] = a[i].y - u; y[yn++] = a[i].y + d;
		y[yn++] = a[i].y - u - 1; y[yn++] = a[i].y + d + 1;
	}
	L.push_back({ 1, 1, 1, 0 });
	y[yn++] = 1; y[yn++] = R;
	sort(y, y + yn);
	yn = unique(y, y + yn) - y;
	for (i = 0; i < L.size(); i++) {
		if (L[i].ys < 1)L[i].ys = 1;
		if (R < L[i].ye)L[i].ye = R;
		L[i].ys = lower_bound(y, y + yn, L[i].ys) - y;
		L[i].ye = lower_bound(y, y + yn, L[i].ye) - y;
	}
	sort(L.begin(), L.end(), sort_x);
	int s = lower_bound(y, y + yn, 1) - y;
	int e = lower_bound(y, y + yn, R) - y;
	for (i = s; i <= e; i++)val[i] = 0;
	for (i = 0; i < L.size();) {
		if (L[i].x > C)return true;
		for (j = i; j < L.size() && L[i].x == L[j].x; j++) {
			for (k = L[j].ys; k <= L[j].ye; k++) {
				val[k] += L[j].pls;
			}
		}
		if (L[i].x >= 1) {
			for (k = s; k <= e; k++) {
				if (val[k] == 0)return false;
			}
		}
		i = j;
	}
	return true;
}
int determine_d(int l, int r, int u) {
	int s = 0, e = R, ret = -1;
	while (s <= e) {
		int m = (s + e) / 2;
		if (simulate(l, r, u, m)) {
			ret = m;
			e = m - 1;
		}
		else {
			s = m + 1;
		}
	}
	return ret;
}

int determine_u(int l, int r) {
	int s = 0, e = R, ret = -1;
	while (e - s >= 3) {
		int p1 = (s * 2 + e) / 3, p2 = (s + e * 2) / 3;
		int k1 = determine_d(l, r, p1);
		int k2 = determine_d(l, r, p2);
		if (k2 < 0) { s = p2 + 1; continue; }
		if (k1 < 0) { s = p1 + 1; continue; }
		if (p1 + k1 < p2 + k2) e = p2;
		else s = p1;
	}

	for (int u = s; u <= e; u++) {
		int d = determine_d(l, r, u);
		if (d == -1)continue;
		if (ret == -1 || ret > l + r + u + d) {
			ret = l + r + u + d;
		}
	}
	return ret;
}

int main() {
	int i, j, k; scanf("%d%d%d", &C, &R, &n);
	for (i = 0; i < n; i++)scanf("%d%d", &a[i].x, &a[i].y);
	int l, r, u, d;
	int ans = 1e9;
	for (l = 0; l <= 40; l++)for (r = 0; r <= 40; r++) {
		int v = determine_u(l, r);

		if (v>=0) {
			ans = min(ans, v);
		}
	}
	printf("%d", ans);
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

cultivation.cpp: In function 'bool simulate(int, int, int, int)':
cultivation.cpp:23:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (i = 0; i < L.size(); i++) {
              ~~^~~~~~~~~~
cultivation.cpp:33:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (i = 0; i < L.size();) {
              ~~^~~~~~~~~~
cultivation.cpp:35:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (j = i; j < L.size() && L[i].x == L[j].x; j++) {
               ~~^~~~~~~~~~
cultivation.cpp: In function 'int main()':
cultivation.cpp:87:9: warning: unused variable 'j' [-Wunused-variable]
  int i, j, k; scanf("%d%d%d", &C, &R, &n);
         ^
cultivation.cpp:87:12: warning: unused variable 'k' [-Wunused-variable]
  int i, j, k; scanf("%d%d%d", &C, &R, &n);
            ^
cultivation.cpp:89:12: warning: unused variable 'u' [-Wunused-variable]
  int l, r, u, d;
            ^
cultivation.cpp:89:15: warning: unused variable 'd' [-Wunused-variable]
  int l, r, u, d;
               ^
cultivation.cpp:87:20: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  int i, j, k; scanf("%d%d%d", &C, &R, &n);
               ~~~~~^~~~~~~~~~~~~~~~~~~~~~
cultivation.cpp:88:30: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for (i = 0; i < n; i++)scanf("%d%d", &a[i].x, &a[i].y);
                         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...