类似 abc327 f 的做法,但是 WA
查看原帖
类似 abc327 f 的做法,但是 WA
1062683
lottle1212__楼主2023/11/15 08:27

只对了 #1

Code

#include <iostream>
#include <algorithm>
#define PP pair <pair <int, int>, int>
#define int long long
#define ls p << 1
#define rs p << 1 | 1
#define X first.first
#define Y first.second
#define L second
using namespace std;
const int N = 1e4 + 10;
PP f[N]; int n, w, h, p[N << 1], cnt;
int rd() {
	int res = 0; bool f = 0; char ch = getchar();
	while (ch < '0' || ch > '9') f |= ch == '-', ch = getchar();
	while (ch >= '0' && ch <= '9') res = (res << 1) + (res << 3) + (ch ^ 48), ch = getchar();
	return f ? -res : res;
}
struct SegmentTree { int l, r, Max, add; } t[N << 3];
void pushdown(int p) { t[ls].Max += t[p].add, t[rs].Max += t[p].add, t[ls].add += t[p].add, t[rs].add += t[p].add, t[p].add = 0; }
void pushup(int p) { t[p].Max = max(t[ls].Max, t[rs].Max); }
void build(int p, int l, int r) {
	t[p] = {l, r, 0, 0};
	if (l == r) return ;
	int mid = l + r >> 1;
	build(ls, l, mid), build(rs, mid + 1, r);
}
void update(int p, int l, int r, int k) {
	if (l <= t[p].l && t[p].r <= r) {
		t[p].Max += k, t[p].add += k;
		return ;
	}
	int mid = t[p].l + t[p].r >> 1; pushdown(p);
	if (l <= mid) update(ls, l, r, k);
	if (r > mid) update(rs, l, r, k);
	pushup(p);
}
int query(int p, int l, int r) {
	if (l <= t[p].l && t[p].r <= r) return t[p].Max;
	int mid = t[p].l + t[p].r >> 1, res = 0; pushdown(p);
	if (l <= mid) res = max(res, query(ls, l, r));
	if (r > mid) res = max(res, query(rs, l, r));
	return res;
}
int lb(int x) {
	int l = 0, r = cnt + 1;
	while (l + 1 < r) {
		int mid = l + r >> 1;
		if (p[mid] >= x) r = mid;
		else l = mid;
	}
	return r;
}
signed main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//	freopen(".in", "r", stdin);
//	freopen(".out", "w", stdout);
	int T = rd();
	while (T --) {
		n = rd(), w = rd(), h = rd(), cnt = 0;
		for (int i = 1, x, y, l; i <= n; ++ i) x = rd(), y = rd(), l = rd(), f[i] = make_pair(make_pair(x, y), l), p[++ cnt] = y, p[++ cnt] = y + w;
		sort(f + 1, f + n + 1); sort(p + 1, p + cnt + 1); cnt = unique(p + 1, p + cnt + 1) - p - 1;
		build(1, 1, cnt); int ans = 0;
		for (int l = 1, r = 0; r <= n; ++ r) {
			if (l > 1) update(1, lb(f[l - 1].Y), lb(f[l - 1].Y + w), -f[l - 1].L);
			while (r < n && f[r + 1].X - f[l].X <= h) ++ r, update(1, lb(f[r].Y), lb(f[r].Y + w), f[r].L);
			ans = max(ans, query(1, 1, cnt));
		}
		cout << ans << '\n';
	}
	return 0;
}
2023/11/15 08:27
加载中...