답안 #671287

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
671287 2022-12-12T18:30:48 Z rainboy 함박 스테이크 (JOI20_hamburg) C
15 / 100
2179 ms 6648 KB
#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

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]);
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 3 ms 340 KB Output is correct
10 Correct 2 ms 340 KB Output is correct
11 Correct 2 ms 340 KB Output is correct
12 Correct 2 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 3 ms 340 KB Output is correct
10 Correct 2 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
13 Correct 9 ms 340 KB Output is correct
14 Correct 2179 ms 424 KB Output is correct
15 Correct 9 ms 460 KB Output is correct
16 Correct 6 ms 340 KB Output is correct
17 Incorrect 1919 ms 464 KB Unexpected end of file - int32 expected
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 74 ms 6476 KB Output is correct
6 Correct 74 ms 6500 KB Output is correct
7 Correct 75 ms 6644 KB Output is correct
8 Correct 75 ms 6536 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 77 ms 6420 KB Output is correct
6 Correct 87 ms 6500 KB Output is correct
7 Correct 78 ms 6428 KB Output is correct
8 Correct 89 ms 6416 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 3 ms 340 KB Output is correct
10 Correct 2 ms 340 KB Output is correct
11 Correct 2 ms 340 KB Output is correct
12 Correct 2 ms 340 KB Output is correct
13 Correct 82 ms 6508 KB Output is correct
14 Correct 79 ms 6420 KB Output is correct
15 Correct 82 ms 6412 KB Output is correct
16 Correct 81 ms 6584 KB Output is correct
17 Correct 80 ms 6532 KB Output is correct
18 Correct 82 ms 6476 KB Output is correct
19 Correct 84 ms 6468 KB Output is correct
20 Correct 93 ms 6524 KB Output is correct
21 Correct 247 ms 6648 KB Output is correct
22 Correct 159 ms 6428 KB Output is correct
23 Correct 135 ms 6484 KB Output is correct
24 Correct 143 ms 6532 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 3 ms 340 KB Output is correct
10 Correct 2 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
13 Correct 9 ms 340 KB Output is correct
14 Correct 2179 ms 424 KB Output is correct
15 Correct 9 ms 460 KB Output is correct
16 Correct 6 ms 340 KB Output is correct
17 Incorrect 1919 ms 464 KB Unexpected end of file - int32 expected
18 Halted 0 ms 0 KB -