记录编号 393392 评测结果 AAAAAAAAAAAAAAA
题目名称 [POI 2001] 金矿 最终得分 100
用户昵称 Gravatarconfoo 是否通过 通过
代码语言 C++ 运行时间 0.126 s
提交时间 2017-04-10 22:08:05 内存使用 1.49 MiB
显示代码纯文本
#include <cstdio>
#include <utility>
#include <algorithm>
#define lch (o<<1)
#define rch ((o<<1)|1)
#define mid ((l + r)>>1)
const int W = 6e4 + 10, DEL = 3e4, N = 15e3 + 10;
typedef std::pair<int, int> pa;
int n, w, h, ans, mx[W << 2], adv[W << 2];
pa st[N];
inline void mkad(int o, int v) {if (o) mx[o] += v, adv[o] += v;}
void down(int o) {
	if (o) mkad(lch, adv[o]), mkad(rch, adv[o]), adv[o] = 0;
}
void add(int o, int l, int r, int q1, int q2, int q3) {
	if (q1 <= l && r <= q2) mkad(o, q3), ans = std::max(ans, mx[o]);
	else {
		down(o);
		if (q1 <= mid) add(lch, l, mid, q1, q2, q3);
		if (mid < q2) add(rch, mid + 1, r, q1, q2, q3);
		mx[o] = std::max(mx[lch], mx[rch]);
		ans = std::max(ans, mx[o]);
	}
}
struct Main {
Main() {
	freopen("kop.in", "r", stdin);
	freopen("kop.out", "w", stdout);
	scanf("%d%d%d", &w, &h, &n);
	for (int i = 1, x, y; i <= n; i++) scanf("%d%d", &x, &y), st[i] = std::make_pair(x + DEL, y + DEL);
	std::sort(st + 1, st + 1 + n);
	for (int i = 1, j = 0; i <= n; i++) {
		while (j + 1 <= n && st[j + 1].first < st[i].first - w) ++j, add(1, 0, DEL<<1, st[j].second, st[j].second + h, -1);
		add(1, 0, DEL<<1, st[i].second, st[i].second + h, 1);
	}
	printf("%d\n", ans);
}
}enter;
int main(){;}