Submission #671287

#TimeUsernameProblemLanguageResultExecution timeMemory
671287rainboyHamburg Steak (JOI20_hamburg)C11
15 / 100
2179 ms6648 KiB
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

#define N	200000
#define K	4
#define INF	0x3f3f3f3f3f3f3f3fLL

long long min(long long a, long long b) { return a < b ? a : b; }
long long max(long long a, long long b) { return a > b ? a : b; }

long long xxl[N], xxr[N], yyl[N], yyr[N], xx[K], yy[K]; int n;

int pierced(int i, int k) {
	int h;

	for (h = 0; h < k; h++)
		if (xxl[i] <= xx[h] && xx[h] <= xxr[i] && yyl[i] <= yy[h] && yy[h] <= yyr[i])
			return 1;
	return 0;
}

void solve(int h_, int k) {
	int h, i;
	long long xl, xr, yl, yr;

	xl = INF, xr = -1, yl = INF, yr = -1;
	for (i = 0; i < n; i++)
		if (!pierced(i, h_))
			xl = min(xl, xxr[i]), xr = max(xr, xxl[i]), yl = min(yl, yyr[i]), yr = max(yr, yyl[i]);
	if (xl == INF) {
		for (h = h_; h < k; h++)
			xx[h] = 1, yy[h] = 1;
		for (h = 0; h < k; h++)
			printf("%lld %lld\n", xx[h], yy[h]);
		exit(0);
	} else if (h_ < k) {
		xx[h_] = xl, yy[h_] = yl, solve(h_ + 1, k);
		xx[h_] = xl, yy[h_] = yr, solve(h_ + 1, k);
		xx[h_] = xr, yy[h_] = yl, solve(h_ + 1, k);
		xx[h_] = xr, yy[h_] = yr, solve(h_ + 1, k);
	}
}

long long ll[N], rr[N]; int ii0[N], ii1[N], ii2[N], n0, n1, n2; long long xl, xr, yl, yr;

long long idx(long long x, long long y) {
	if (y == yl)
		return x - xl;
	if (x == xr)
		return xr - xl + y - yl;
	if (y == yr)
		return xr - xl + yr - yl + xr - x;
	if (x == xl)
		return xr - xl + yr - yl + xr - xl + yr - y;
	return -1;
}

long long xl_, yl_, xr_, yr_;

void get_min_max() {
	int h, i, i_, pierced;

	xl_ = INF, xr_ = -1, yl_ = INF, yr_ = -1;
	for (i = 0; i < n0; i++) {
		i_ = ii0[i], pierced = 0;
		for (h = 0; h < 4; h++) {
			long long z = idx(xx[h], yy[h]);

			if (ll[i_] <= z && z <= rr[i_]) {
				pierced = 1;
				break;
			}
		}
		if (!pierced)
			xl_ = min(xl_, xxr[i]), xr_ = max(xr_, xxl[i]), yl_ = min(yl_, yyr[i]), yr_ = max(yr_, yyl[i]);
	}
	for (i = 0; i < n1; i++) {
		i_ = ii1[i], pierced = 0;
		for (h = 0; h < 4; h++)
			if (ll[i_] <= xx[h] && xx[h] <= rr[i_]) {
				pierced = 1;
				break;
			}
		if (!pierced)
			xl_ = min(xl_, xxr[i]), xr_ = max(xr_, xxl[i]), yl_ = min(yl_, yyr[i]), yr_ = max(yr_, yyl[i]);
	}
	for (i = 0; i < n2; i++) {
		i_ = ii2[i], pierced = 0;
		for (h = 0; h < 4; h++)
			if (ll[i_] <= yy[h] && yy[h] <= rr[i_]) {
				pierced = 1;
				break;
			}
		if (!pierced)
			xl_ = min(xl_, xxr[i]), xr_ = max(xr_, xxl[i]), yl_ = min(yl_, yyr[i]), yr_ = max(yr_, yyl[i]);
	}
}

void solve_(int h_, int k) {
	int h, i;

	get_min_max();
	if (xl_ == INF) {
		for (h = h_; h < k; h++)
			xx[h] = 1, yy[h] = 1;
		for (h = 0; h < k; h++)
			printf("%lld %lld\n", xx[h], yy[h]);
		exit(0);
	} else {
		if (h_ == 0) {
			xx[h_] = xl_;
			for (i = 0; i < n; i++) {
				yy[h_] = yyl[i];
				if (idx(xx[h_], yy[h_]) != -1)
					solve(h_ + 1, k);
			}
		} else {
			xx[h_] = xl_, yy[h_] = yl_;
			if (idx(xx[h_], yy[h_]) != -1)
				solve(h_ + 1, k);
			xx[h_] = xl_, yy[h_] = yr_;
			if (idx(xx[h_], yy[h_]) != -1)
				solve(h_ + 1, k);
			xx[h_] = xr_, yy[h_] = yl_;
			if (idx(xx[h_], yy[h_]) != -1)
				solve(h_ + 1, k);
			xx[h_] = xr_, yy[h_] = yr_;
			if (idx(xx[h_], yy[h_]) != -1)
				solve(h_ + 1, k);
		}
	}
}

int main() {
	int k, i;
	long long l, r;

	scanf("%d%d", &n, &k);
	for (i = 0; i < n; i++)
		scanf("%lld%lld%lld%lld", &xxl[i], &yyl[i], &xxr[i], &yyr[i]);
	solve(0, k);
	xl = INF, xr = -1, yl = INF, yr = -1;
	for (i = 0; i < n; i++)
		xl = min(xl, xxr[i]), xr = max(xr, xxl[i]), yl = min(yl, yyr[i]), yr = max(yr, yyl[i]);
	assert(k == 4 && xl < xr && yl < yr);
	for (i = 0; i < n; i++)
		xxl[i] = max(xxl[i], xl), xxr[i] = min(xxr[i], xr), yyl[i] = max(yyl[i], yl), yyr[i] = min(yyr[i], yr);
	for (i = 0; i < n; i++)
		if (xl < xxl[i] && xxr[i] < xr && yyl[i] == yl && yyr[i] == yr)
			ll[i] = xxl[i], rr[i] = xxr[i], ii1[n1++] = i;
		else if (yl < yyl[i] && yyr[i] < yr && xxl[i] == xl && xxr[i] == xr)
			ll[i] = yyl[i], rr[i] = yyr[i], ii2[n2++] = i;
		else {
			l = INF, r = -1;
			if (yyl[i] == yl) {
				l = min(l, xxl[i] - xl), r = max(r, xxr[i] - xl);
				if (xxl[i] == xl)
					l += xr - xl + yr - yl + xr - xl + yr - yl, r += xr - xl + yr - yl + xr - xl + yr - yl;
			}
			if (xxr[i] == xr)
				l = min(l, xr - xl + yyl[i] - yl), r = max(r, xr - xl + yyr[i] - yl);
			if (yyr[i] == yr)
				l = min(l, xr - xl + yr - yl + xr - xxr[i]), r = max(r, xr - xl + yr - yl + xr - xxl[i]);
			if (xxl[i] == xl)
				l = min(l, xr - xl + yr - yl + xr - xl + yr - yyr[i]), r = max(r, xr - xl + yr - yl + xr - xl + yr - yyl[i]);
			ll[i] = l, rr[i] = r, ii0[n0++] = i;
		}
	solve_(0, 4);
	return 0;
}

Compilation message (stderr)

hamburg.c: In function 'main':
hamburg.c:139:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  139 |  scanf("%d%d", &n, &k);
      |  ^~~~~~~~~~~~~~~~~~~~~
hamburg.c:141:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  141 |   scanf("%lld%lld%lld%lld", &xxl[i], &yyl[i], &xxr[i], &yyr[i]);
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...