Submission #1837143


Source Code Expand

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cassert>
#define rep(i, a, b) for (int i = (a), _ = (b); i <= _; ++ i)
#define per(i, a, b) for (int i = (a), _ = (b); i >= _; -- i)
#define For(i, a, b) for (int i = (a), _ = (b); i < _; ++ i)
#define ri rd<int>
using namespace std;
const int maxN = 3e5 + 7;

template<class T> inline T rd() {
	bool f = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') f = 0;
	T x = 0; for (; isdigit(c); c = getchar()) x = x * 10 + c - 48; return f ? x : -x;
}

int W, H, C, n, ans;

struct pt {
	int x, y;
	inline bool operator < (const pt &v) const { return x < v.x; }
}d[maxN];

inline bool in(const pt &x, const pt &y) {
	return y.x <= x.x && x.y <= y.y;
}

inline int calc(const pt &x, const pt &y, const pt &l, const pt &r) {
	return y.x - x.x + min(l.y, r.y) - max(l.x, r.x);
}

void solve(int l, int r) {
	if (l >= r) return;	
	static pt a[maxN];
	static deque<pt> q;
	int mid = (l + r) >> 1;
	solve(l, mid);
	solve(mid+1, r);

	for (int up = H, dw = 0, i = mid; i >= l; -- i) {
		a[i] = (pt){dw, up};
		if (d[i].y >= C) up = min(up, d[i].y);
		if (d[i].y <= C) dw = max(dw, d[i].y); 
	}

	for (int up = H, dw = 0, i = mid+1; i <= r; ++ i) {
		a[i] = (pt){dw, up};
		if (d[i].y >= C) up = min(up, d[i].y);
		if (d[i].y <= C) dw = max(dw, d[i].y);
	}

	for (int i = l, j = r; i <= mid; ++ i) {
		for (; j > mid && !in(a[i], a[j]); -- j);
		if (in(a[i], a[j])) ans = max(ans, calc(d[i], d[j], a[i], a[j])); else break;
	}

	for (int i = r, j = l; i > mid; -- i) {
		for (; j <= mid && !in(a[i], a[j]); ++ j);
		if (in(a[i], a[j])) ans = max(ans, calc(d[i], d[j], a[i], a[j])); else break;
	}

#define eval(v) ((v).x + (v).y)
	while (!q.empty()) q.pop_back();
	for (int i = mid, j = mid+1; i >= l; -- i) {
		for (; j <= r && a[j].x <= a[i].x; ++ j) {
			pt nw = (pt){d[j].x, a[j].y};
			while (!q.empty() && eval(q.back()) <= eval(nw)) q.pop_back();
			q.push_back(nw);
		}
		while (!q.empty() && q.front().y > a[i].y) q.pop_front();
		if (!q.empty()) ans = max(ans, eval(q.front()) - d[i].x - a[i].x);
	}
#undef eval
#define eval(v) ((v).y - (v).x)
	while (!q.empty()) q.pop_back();
	for (int i = mid + 1, j = mid; i <= r; ++ i) {
		for (; j >= l && a[j].x <= a[i].x; -- j) {
			pt nw = (pt){d[j].x, a[j].y};
			while (!q.empty() && eval(q.back()) <= eval(nw)) q.pop_back();
			q.push_back(nw);
		}
		while (!q.empty() && q.front().y > a[i].y) q.pop_front();
		if (!q.empty()) ans = max(ans, eval(q.front()) + d[i].x - a[i].x);
	}
#undef eval
}

int main() {

	W = ri(), H = ri(), n = ri();
	rep (i, 1, n) d[i].x = ri(), d[i].y = ri();
	ans = max(W, H) + 1;

	sort(d+1, d+n+1); C = H / 2;
	d[0] = (pt){0, C}, d[n+1] = (pt){W, C};
	ans = max(ans, d[1].x + H);
	ans = max(ans, W - d[n].x + H);
	solve(0, n+1);

	rep (i, 1, n) swap(d[i].x, d[i].y); swap(H, W);
	sort(d+1, d+n+1); C = H / 2;
	d[0] = (pt){0, C}, d[n+1] = (pt){W, C};
	ans = max(ans, d[1].x + H);
	ans = max(ans, W - d[n].x + H);
	solve(0, n+1);

	printf("%d\n", ans << 1);

	return 0;
}

Submission Info

Submission Time
Task F - Snuke's Coloring 2
User acha
Language C++14 (GCC 5.4.1)
Score 0
Code Size 3217 Byte
Status WA
Exec Time 298 ms
Memory 4864 KB

Judge Result

Set Name sample All
Score / Max Score 0 / 0 0 / 1600
Status
AC × 4
AC × 53
WA × 4
Set Name Test Cases
sample sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt
All dia_01.txt, dia_02.txt, dia_03.txt, dia_04.txt, dial_01.txt, dial_02.txt, dial_03.txt, dial_04.txt, dial_05.txt, dial_06.txt, dialr_01.txt, dialr_02.txt, dialr_03.txt, dialr_04.txt, diar_01.txt, diar_02.txt, diar_03.txt, hand_01.txt, hand_02.txt, hand_03.txt, hand_04.txt, hand_05.txt, poc_t_1.txt, poc_t_2.txt, poc_t_3.txt, poc_t_4.txt, poc_t_5.txt, poc_w_1.txt, poc_w_2.txt, random0_01.txt, random0_02.txt, random0_03.txt, random1_01.txt, random1_02.txt, random1_03.txt, random1_04.txt, random1_05.txt, random1_06.txt, random1_07.txt, rect_01.txt, rect_02.txt, rect_03.txt, rect_04.txt, rect_05.txt, rect_06.txt, rect_07.txt, rect_08.txt, rect_09.txt, rect_10.txt, sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt, x_01.txt, x_02.txt, x_03.txt, x_04.txt
Case Name Status Exec Time Memory
dia_01.txt AC 193 ms 4864 KB
dia_02.txt AC 193 ms 4864 KB
dia_03.txt AC 194 ms 4864 KB
dia_04.txt AC 198 ms 4864 KB
dial_01.txt AC 192 ms 4864 KB
dial_02.txt AC 194 ms 4864 KB
dial_03.txt AC 198 ms 4864 KB
dial_04.txt AC 201 ms 4864 KB
dial_05.txt AC 201 ms 4864 KB
dial_06.txt AC 202 ms 4864 KB
dialr_01.txt AC 265 ms 4864 KB
dialr_02.txt AC 282 ms 4864 KB
dialr_03.txt AC 277 ms 4864 KB
dialr_04.txt AC 291 ms 4864 KB
diar_01.txt AC 258 ms 4864 KB
diar_02.txt AC 259 ms 4864 KB
diar_03.txt AC 260 ms 4864 KB
hand_01.txt AC 1 ms 2304 KB
hand_02.txt AC 2 ms 2304 KB
hand_03.txt AC 1 ms 2304 KB
hand_04.txt AC 1 ms 2304 KB
hand_05.txt AC 1 ms 2304 KB
poc_t_1.txt AC 1 ms 2304 KB
poc_t_2.txt AC 1 ms 2304 KB
poc_t_3.txt AC 1 ms 2304 KB
poc_t_4.txt AC 1 ms 2304 KB
poc_t_5.txt AC 1 ms 2304 KB
poc_w_1.txt AC 1 ms 2304 KB
poc_w_2.txt AC 1 ms 2304 KB
random0_01.txt AC 287 ms 4864 KB
random0_02.txt AC 291 ms 4864 KB
random0_03.txt AC 298 ms 4864 KB
random1_01.txt AC 282 ms 4864 KB
random1_02.txt AC 288 ms 4864 KB
random1_03.txt AC 294 ms 4864 KB
random1_04.txt AC 287 ms 4864 KB
random1_05.txt AC 293 ms 4864 KB
random1_06.txt WA 281 ms 4864 KB
random1_07.txt AC 281 ms 4864 KB
rect_01.txt WA 285 ms 4864 KB
rect_02.txt AC 283 ms 4864 KB
rect_03.txt WA 287 ms 4864 KB
rect_04.txt AC 278 ms 4864 KB
rect_05.txt AC 280 ms 4864 KB
rect_06.txt AC 267 ms 4864 KB
rect_07.txt AC 287 ms 4864 KB
rect_08.txt WA 289 ms 4864 KB
rect_09.txt AC 291 ms 4864 KB
rect_10.txt AC 291 ms 4864 KB
sample_01.txt AC 2 ms 2304 KB
sample_02.txt AC 1 ms 2304 KB
sample_03.txt AC 1 ms 2304 KB
sample_04.txt AC 1 ms 2304 KB
x_01.txt AC 188 ms 4864 KB
x_02.txt AC 188 ms 4864 KB
x_03.txt AC 189 ms 4864 KB
x_04.txt AC 194 ms 4864 KB