답안 #76333

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
76333 2018-09-12T17:26:30 Z arock 자리 배치 (IOI18_seats) C++14
31 / 100
4000 ms 77568 KB
#include "seats.h"
#include <bits/stdc++.h>
using namespace std;

int H, W;
vector<int> R, C;

struct seg {
	int min[2], ans;
} tree[4 * 1000 * 1000];
int lazy[2][4 * 1000 * 1000];
vector<vector<int>> RC;

seg merge(seg a, seg b) {
	if (a.min[0] < b.min[0]) {
		return a;
	} else if(b.min[0] < a.min[0]) {
		return b;
	} else if (a.min[1] < b.min[1]) {
		return a;
	} else if (b.min[1] < a.min[1]) {
		return b;
	} else {
		return {{a.min[0], a.min[1]}, a.ans + b.ans};
	}
}

seg build(int cur, int lo, int hi) {
	if (lo == hi) {
		return tree[cur] = {{0, 0}, 1};
	}

	int lmid = (lo + hi) / 2, rmid = lmid + 1;
	return tree[cur] = merge(build(cur << 1 | 0, lo, lmid),
		                     build(cur << 1 | 1, rmid, hi));
}

void update(int type, int l, int r, int delta, int cur, int lo, int hi) {

	if (lo == l && hi == r) {
		lazy[type][cur]     += delta;
		tree[cur].min[type] += delta;
	} else {

		for(int tt = 0; tt < 2; tt++) {
			lazy[tt][cur << 1 | 0]     += lazy[tt][cur];
			tree[cur << 1 | 0].min[tt] += lazy[tt][cur];
			lazy[tt][cur << 1 | 1]     += lazy[tt][cur];
			tree[cur << 1 | 1].min[tt] += lazy[tt][cur];
			lazy[tt][cur] = 0;
		}

		int lmid = (lo + hi) / 2, rmid = lmid + 1;
		if (l <= lmid) {
			update(type, l, min(r, lmid), delta, cur << 1 | 0, lo, lmid);
		}
		if (r >= rmid) {
			update(type, max(l, rmid), r, delta, cur << 1 | 1, rmid, hi);
		}

		tree[cur] = merge(tree[cur << 1 | 0],
			              tree[cur << 1 | 1]);
	}
}

void update(int type, int l, int r, int delta) {
	if (l < r)
		update(type, l + 1, r, delta, 1, 1, H * W);
}

void give_initial_chart(int HH, int WW, vector<int> RR, vector<int> CC) {

	H = HH, W = WW, R = RR, C = CC;

	RC = vector<vector<int>>(H + 2, vector<int>(W + 2, H * W));
	for (int i = 0; i < H * W; i++) {
		RC[R[i] + 1][C[i] + 1] = i;
	}

	build(1, 1, H * W);

	for (int i = 0; i <= H; i++) {
		for (int j = 0; j <= W; j++) {
			int adj[4] = {RC[i][j], RC[i][j + 1], RC[i + 1][j], RC[i + 1][j + 1]};
			sort(adj, adj + 4);

			update(0, adj[0], adj[1], +1);
			update(1, adj[2], adj[3], +1);
		}
	}
}


int swap_seats(int a, int b) {

	int ax = R[a] + 1, ay = C[a] + 1;
	int bx = R[b] + 1, by = C[b] + 1;

	for (int i = -1; i < 1; i++) {
		for (int j = -1; j < 1; j++) {
			int adja[4] = {RC[ax + i][ay + j], RC[ax + i][ay + j + 1], RC[ax + i + 1][ay + j], RC[ax + i + 1][ay + j + 1]};
			sort(adja, adja + 4);

			update(0, adja[0], adja[1], -1);
			update(1, adja[2], adja[3], -1);

			int adjb[4] = {RC[bx + i][by + j], RC[bx + i][by + j + 1], RC[bx + i + 1][by + j], RC[bx + i + 1][by + j + 1]};
			sort(adjb, adjb + 4);

			update(0, adjb[0], adjb[1], -1);
			update(1, adjb[2], adjb[3], -1);
		}
	}

	swap(RC[ax][ay], RC[bx][by]);
	swap(R[a], R[b]);
	swap(C[a], C[b]);

	for (int i = -1; i < 1; i++) {
		for (int j = -1; j < 1; j++) {
			int adja[4] = {RC[ax + i][ay + j], RC[ax + i][ay + j + 1], RC[ax + i + 1][ay + j], RC[ax + i + 1][ay + j + 1]};
			sort(adja, adja + 4);

			update(0, adja[0], adja[1], +1);
			update(1, adja[2], adja[3], +1);

			int adjb[4] = {RC[bx + i][by + j], RC[bx + i][by + j + 1], RC[bx + i + 1][by + j], RC[bx + i + 1][by + j + 1]};
			sort(adjb, adjb + 4);

			update(0, adjb[0], adjb[1], +1);
			update(1, adjb[2], adjb[3], +1);
		}
	}

	return tree[1].ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 376 KB Output is correct
2 Correct 39 ms 500 KB Output is correct
3 Correct 57 ms 560 KB Output is correct
4 Correct 35 ms 652 KB Output is correct
5 Correct 29 ms 744 KB Output is correct
6 Correct 50 ms 812 KB Output is correct
7 Correct 51 ms 812 KB Output is correct
8 Correct 47 ms 812 KB Output is correct
9 Correct 45 ms 812 KB Output is correct
10 Correct 51 ms 828 KB Output is correct
11 Correct 45 ms 828 KB Output is correct
12 Correct 30 ms 828 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 376 KB Output is correct
2 Correct 39 ms 500 KB Output is correct
3 Correct 57 ms 560 KB Output is correct
4 Correct 35 ms 652 KB Output is correct
5 Correct 29 ms 744 KB Output is correct
6 Correct 50 ms 812 KB Output is correct
7 Correct 51 ms 812 KB Output is correct
8 Correct 47 ms 812 KB Output is correct
9 Correct 45 ms 812 KB Output is correct
10 Correct 51 ms 828 KB Output is correct
11 Correct 45 ms 828 KB Output is correct
12 Correct 30 ms 828 KB Output is correct
13 Correct 131 ms 1728 KB Output is correct
14 Correct 161 ms 1728 KB Output is correct
15 Correct 90 ms 1772 KB Output is correct
16 Correct 66 ms 2108 KB Output is correct
17 Correct 114 ms 2108 KB Output is correct
18 Correct 107 ms 2108 KB Output is correct
19 Correct 106 ms 2108 KB Output is correct
20 Correct 84 ms 2108 KB Output is correct
21 Correct 66 ms 2108 KB Output is correct
22 Correct 67 ms 2188 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3902 ms 69308 KB Output is correct
2 Correct 1964 ms 69488 KB Output is correct
3 Correct 1992 ms 69512 KB Output is correct
4 Correct 1737 ms 69512 KB Output is correct
5 Correct 1776 ms 69512 KB Output is correct
6 Correct 1684 ms 69512 KB Output is correct
7 Correct 1861 ms 69512 KB Output is correct
8 Correct 1899 ms 69512 KB Output is correct
9 Correct 1940 ms 69512 KB Output is correct
10 Correct 1776 ms 69512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 121 ms 69512 KB Output is correct
2 Correct 271 ms 69512 KB Output is correct
3 Correct 1742 ms 69512 KB Output is correct
4 Execution timed out 4043 ms 69512 KB Time limit exceeded
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 76 ms 69512 KB Output is correct
2 Correct 161 ms 69512 KB Output is correct
3 Correct 292 ms 69512 KB Output is correct
4 Correct 401 ms 69512 KB Output is correct
5 Correct 694 ms 69512 KB Output is correct
6 Correct 2491 ms 77568 KB Output is correct
7 Correct 2980 ms 77568 KB Output is correct
8 Correct 2502 ms 77568 KB Output is correct
9 Execution timed out 4056 ms 77568 KB Time limit exceeded
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 376 KB Output is correct
2 Correct 39 ms 500 KB Output is correct
3 Correct 57 ms 560 KB Output is correct
4 Correct 35 ms 652 KB Output is correct
5 Correct 29 ms 744 KB Output is correct
6 Correct 50 ms 812 KB Output is correct
7 Correct 51 ms 812 KB Output is correct
8 Correct 47 ms 812 KB Output is correct
9 Correct 45 ms 812 KB Output is correct
10 Correct 51 ms 828 KB Output is correct
11 Correct 45 ms 828 KB Output is correct
12 Correct 30 ms 828 KB Output is correct
13 Correct 131 ms 1728 KB Output is correct
14 Correct 161 ms 1728 KB Output is correct
15 Correct 90 ms 1772 KB Output is correct
16 Correct 66 ms 2108 KB Output is correct
17 Correct 114 ms 2108 KB Output is correct
18 Correct 107 ms 2108 KB Output is correct
19 Correct 106 ms 2108 KB Output is correct
20 Correct 84 ms 2108 KB Output is correct
21 Correct 66 ms 2108 KB Output is correct
22 Correct 67 ms 2188 KB Output is correct
23 Correct 3902 ms 69308 KB Output is correct
24 Correct 1964 ms 69488 KB Output is correct
25 Correct 1992 ms 69512 KB Output is correct
26 Correct 1737 ms 69512 KB Output is correct
27 Correct 1776 ms 69512 KB Output is correct
28 Correct 1684 ms 69512 KB Output is correct
29 Correct 1861 ms 69512 KB Output is correct
30 Correct 1899 ms 69512 KB Output is correct
31 Correct 1940 ms 69512 KB Output is correct
32 Correct 1776 ms 69512 KB Output is correct
33 Correct 121 ms 69512 KB Output is correct
34 Correct 271 ms 69512 KB Output is correct
35 Correct 1742 ms 69512 KB Output is correct
36 Execution timed out 4043 ms 69512 KB Time limit exceeded
37 Halted 0 ms 0 KB -