답안 #503001

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
503001 2022-01-06T21:32:41 Z sidon Two Antennas (JOI19_antennas) C++17
0 / 100
473 ms 62416 KB
#include <bits/stdc++.h>
using namespace std;
#define int long long

#define remax(X, Y) X = max(X, Y)
#define remin(X, Y) X = min(X, Y)

const int Z = 2e5, INF = 1e12;

int sL, sR, sV;
struct SegmentTree{
	int l, r, sMin = INF, sMax = -INF, res = -INF;
	SegmentTree *L, *R;
	void pull() {
		sMin = min(L->sMin, R->sMin);
		res = max({L->res, R->res, sMax - sMin});
	}
	void apply(int val) {
		remax(sMax, val);
		res = sMax - sMin;
		if(r - l > 1) pull();
	}
	void push() {
		L->apply(sMax);
		R->apply(sMax);
	}
	SegmentTree(int lx, int rx) : l(lx), r(rx) {
		if(r - l > 1) {
			int m = (l + r) / 2;
			L = new SegmentTree(l, m);
			R = new SegmentTree(m, r);
		}
	}
	void rangeMaximise(int lx, int rx, int v) {
		sL = lx, sR = rx, sV = v;
		rangeMaximise();
	}
	void rangeMaximise() {
		if(sL<=l && r<=sR) return apply(sV);
		if(sR<=l || r<=sL) return;
		push();
		L->rangeMaximise(), R->rangeMaximise();
		pull();
	}
	void pointUpdate(int i, int v) {
		sL = i, sV = v;
		pointUpdate();
	}
	void pointUpdate() {
		if(r - l < 2) {
			sMax = -INF;
			sMin = sV, res = sMax - sMin;
			return;
		}
		push();
		(sL < L->r ? L : R)->pointUpdate();
		pull();
	}
	int rangeMaxDiff(int lx, int rx) {
		sL = lx, sR = rx;
		return query();
	}
	int query() {
		if(sL<=l && r<=sR) return res;
		if(sR<=l || r<=sL) return -INF;
		push();
		return max(L->query(), R->query());
	}
};

int N, Q, H[Z], A[Z], B[Z], qL[Z], qR[Z], ans[Z];

vector<int> add[Z+1], qAt[Z];

signed main() {
	ios::sync_with_stdio(0); cin.tie(0);

	cin >> N;

	for(int i = 0; i < N; ++i) {
		cin >> H[i] >> A[i] >> B[i];

		if(i + A[i] <  N) {
			add[i + A[i]].push_back(i);
			add[min(N, i+B[i]+1)].push_back(-i-1);
		}
	}

	cin >> Q;
	
	for(int i = 0; i < Q; ++i) {
		cin >> qL[i] >> qR[i];
		--qL[i], --qR[i];
		qAt[qR[i]].push_back(i);
		ans[i] = -1;
	}

	for(int _ : {1, 0}) {
		SegmentTree st(0, N);
		for(int i = 0; i < N; ++i) {
			for(int &j : add[i]) {
				if(j < 0) st.pointUpdate(-j-1, INF);
				else st.pointUpdate(j, H[j]);
			}
			if(i - A[i] >= 0) 
				st.rangeMaximise(max(0LL, i-B[i]), i-A[i]+1, H[i]);
			
			for(int &j : qAt[i])
				ans[j] = max(ans[j], st.rangeMaxDiff(qL[j], i+1));
		}
		if(_) for(int &i : H) i = -i;
	}

	for(int i = 0; i < Q; ++i) {
		cout << ans[i] << '\n';
	}
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 11340 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 11340 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 473 ms 62416 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 11340 KB Output isn't correct
2 Halted 0 ms 0 KB -