10pts求调
查看原帖
10pts求调
556000
Mrkn_chenyx12楼主2023/9/18 18:38

求调送关。

#1 AC,#3-6 WA,其他 RE。

#include <bits/stdc++.h>
using namespace std;

// Wish CSP-J/S 2023 RP++!

struct sc {
	int v, x;
}adder[10024], remover[10024];

int n,w,h,x[10024],y[10024],li[10024], as[20024], rs[20024], ac, rc;
long long seg[40024], lazy[40024];
int ves[20024], vss[20024], vt, vx;

int ed[20024], s[20024], mp[20024];

inline long long _max(long long _x, long long _y) {
	return _x > _y ? _x : _y;
}

inline bool ecmp(int _x, int _y) {
	return ed[_x] < ed[_y];
}

inline bool vcmp(int _x, int _y) {
	return ves[_x] < ves[_y];
}

inline void pushdown(int id) {
	seg[id] += lazy[id];
	lazy[id<<1] += lazy[id];
	lazy[id<<1|1] += lazy[id];
	lazy[id] = 0;
}

inline void rmlazy(int id) {
	seg[id] += lazy[id];
	lazy[id] = 0;
}

void Modify(int id, int l, int r, int L, int R, int val) {
	if(L == R) {
		if(lazy[id]) {
			rmlazy(id);
		}
		seg[id] += val;
		return;
	}
	if(lazy[id]) {
		pushdown(id);
	}
	if(l<=L&&R<=r) {
		lazy[id] = val;
		pushdown(id);
		return;
	}
	int mid = (L+R) >> 1;
	if(l <= mid) {
		Modify(id<<1, l, r, L, mid, val);
	}
	if(r>mid) {
		Modify(id<<1|1, l, r, mid + 1, R, val);
	}
	seg[id] = _max(seg[id<<1], seg[id<<1|1]);
}

int main() {
	#ifdef _PDEBUG_
	freopen("1502.in", "r", stdin);
	freopen("1502.out", "w", stdout);
	#endif
	int t;
	int _k = 0, _p = -1;
	scanf("%d" ,&t);
	while(t--) {
		vx = 0;
		vt = -1;
		ac = 0;
		rc = 0;
		memset(seg, 0, sizeof(seg));
		memset(lazy, 0, sizeof(lazy));
		memset(as, -1, sizeof(as));
		memset(rs, -1, sizeof(rs));
		scanf("%d %d %d", &n, &w, &h);
		for(int i=1;i<=n;i++) {
			scanf("%d %d %d", x+i, y+i, li+i);
			ed[i<<1] = x[i];
			ed[i<<1|1] = x[i] + w - 1;
			ves[i<<1] = y[i];
			ves[i<<1|1] = y[i] + h;
			s[i<<1] = i<<1;
			s[i<<1|1] = i<<1|1;
			vss[i<<1] = i<<1;
			vss[i<<1|1] = i<<1|1;
		}
		sort(s + 2, s + ((n + 1) << 1), ecmp);
		sort(vss + 2, vss + ((n+1) << 1), vcmp);
		for(int i=2;i<(n+1)<<1;i++) {
			if(ed[s[i]] != _p) {
				_p = ed[s[i]];
				_k++;
			}
			mp[s[i]] = _k;
		}
		for(int i = 2; i < (n+1)<<1; i++) {
			if(ves[i] != vt) {
				vt = ves[i];
				vx++;
			}
			if(vss[i]&1) {
				remover[rc].v=vss[i]>>1;
				remover[rc].x=rs[vx];
				rs[vx] = rc;
				rc++;
			}else {
				adder[ac].v=vss[i]>>1;
				adder[ac].x=as[vx];
				as[vx]=ac;
				ac++;
			}
		}
		long long ans = 0;
		for(int i=1;i<=vx;i++) {
			int _nx = as[i];
			while(~_nx) {
				Modify(1, mp[adder[_nx].v<<1], mp[adder[_nx].v<<1|1], 1, _k, li[adder[_nx].v]);
				_nx = adder[_nx].x;
			}
			_nx = rs[i];
			while(~_nx) {
				Modify(1, mp[remover[_nx].v<<1], mp[remover[_nx].v<<1|1], 1, _k, -li[remover[_nx].v]);
				_nx = remover[_nx].x;
			}
			ans = _max(ans, seg[1]);
		}
		printf("%lld\n", ans);
	}
	return 0;
}
2023/9/18 18:38
加载中...