Submission #476625

# Submission time Handle Problem Language Result Execution time Memory
476625 2021-09-27T19:36:47 Z cheissmart Two Antennas (JOI19_antennas) C++14
22 / 100
1468 ms 30716 KB
#include <bits/stdc++.h>
#pragma GCC optimize("trapv")
#define IO_OP std::ios::sync_with_stdio(0); std::cin.tie(0);
#define F first
#define S second
#define V vector
#define PB push_back
#define MP make_pair
#define EB emplace_back
#define ALL(v) (v).begin(), (v).end()

using namespace std;

typedef long long ll;
typedef pair<int, int> pi;
typedef V<int> vi;

string _reset = "\u001b[0m", _yellow = "\u001b[33m", _bold = "\u001b[1m";
void DBG() { cerr << "]" << _reset << endl; }
template<class H, class...T> void DBG(H h, T ...t) {
	cerr << to_string(h);
	if(sizeof ...(t)) cerr << ", ";
	DBG(t...);
}
#ifdef CHEISSMART
#define debug(...) cerr << _yellow << _bold << "Line(" << __LINE__ << ") -> [" << #__VA_ARGS__ << "]: [", DBG(__VA_ARGS__)
#else
#define debug(...)
#endif

const int INF = 1e9 + 7, N = 2e5 + 7;
void cmax(int& a, int b) {
	a = max(a, b);
}

int h[N], a[N], b[N], l[N], r[N], ans[N];
vi G[N];

int n;

int seg_a[N];

struct node {
	int base_mx, lz_mx, sum_mx;
	bool active;
	node() {
		base_mx = lz_mx = sum_mx = -INF;
		active = true;
	}
	int Base_mx() {
		if(!active) return -INF;
		return base_mx;
	}
} t[N * 4];

void pull(int v) {
	t[v].base_mx = max(t[v * 2].Base_mx(), t[v * 2 + 1].Base_mx());
	t[v].sum_mx = max(t[v * 2].sum_mx, t[v * 2 + 1].sum_mx);
}

void apply(int v, int x) {
	if(!t[v].active)
		return;
	cmax(t[v].sum_mx, t[v].base_mx + x);
	cmax(t[v].lz_mx, x);
}

void push(int v) {
	apply(v * 2, t[v].lz_mx);
	apply(v * 2 + 1, t[v].lz_mx);
	t[v].lz_mx = -INF;
}

void build(int v = 1, int tl = 0, int tr = n) {
	t[v] = node();
	if(tr - tl == 1) {
		t[v].active = false;
		return;
	}
	int tm = (tl + tr) / 2;
	build(v * 2, tl, tm);
	build(v * 2 + 1, tm, tr);
	pull(v);
}

void activate(int pos, bool op, int v = 1, int tl = 0, int tr = n) {
	if(tr - tl == 1) {
		assert(tl == pos);
		t[v].active = op;
		if(op)
			t[v].base_mx = seg_a[pos];
		return;
	}
	push(v);
	int tm = (tl + tr) / 2;
	if(pos < tm)
		activate(pos, op, v * 2, tl, tm);
	else
		activate(pos, op, v * 2 + 1, tm, tr);
	pull(v);
}

void upd(int l, int r, int x, int v = 1, int tl = 0, int tr = n) {
	if(l <= tl && tr <= r) {
		apply(v, x);
		return;
	}
	push(v);
	int tm = (tl + tr) / 2;
	if(l < tm)
		upd(l, r, x, v * 2, tl, tm);
	if(r > tm)
		upd(l, r, x, v * 2 + 1, tm, tr);
	pull(v);
}

int qry(int l, int r, int v = 1, int tl = 0, int tr = n) {
	if(l <= tl && tr <= r)
		return t[v].sum_mx;
	push(v);
	int tm = (tl + tr) / 2;
	int ans = -INF;
	if(l < tm)
		cmax(ans, qry(l, r, v * 2, tl, tm));
	if(r > tm)
		cmax(ans, qry(l, r, v * 2 + 1, tm, tr));
	return ans;
}

V<pair<int, bool>> ev[N];

signed main()
{
	IO_OP;
	
	cin >> n;
	for(int i = 0; i < n; i++) {
		cin >> h[i] >> a[i] >> b[i];
	}
	int q;
	cin >> q;
	for(int i = 0; i < q; i++) {
		cin >> l[i] >> r[i];
		l[i]--, r[i]--;
		ans[i] = -1;
	}

	auto solve = [&] () {
		for(int i = 0; i < n; i++) {
			seg_a[i] = -h[i];
		}
		build();
		for(int i = 0; i < n; i++) {
			for(auto[x, y]:ev[i]) {
				activate(x, y);
			}
			int L = i - b[i], R = i - a[i];
			if(R < 0) continue;
			L = max(L, 0);
			upd(L, R + 1, h[i]);
			for(int j:G[i]) {
				assert(r[j] == i);
				cmax(ans[j], qry(l[j], i));
			}
		}
	};

	auto solve1 = [&] () {
		for(int i = 0; i < q; i++) {
			assert(l[i] < r[i]);
			G[r[i]].PB(i);
		}
		for(int i = 0; i < n; i++) {
			int L = i + a[i], R = i + b[i];
			if(L < n) {
				R = min(R, n - 1);
				ev[L].EB(i, true);
				if(R + 1 < n) ev[R + 1].EB(i, false);
			}
		}
		solve();
		for(int i = 0; i < n; i++)
			h[i] *= -1;
		solve();
		for(int i = 0; i < n; i++) {
			G[i].clear();
			ev[i].clear();
		}
	};

	solve1();
	reverse(h, h + n), reverse(a, a + n), reverse(b, b + n);
	for(int i = 0; i < q; i++) {
		l[i] = n - l[i] - 1, r[i] = n - r[i] - 1;
		swap(l[i], r[i]);
	}
	solve1();

	for(int i = 0; i < q; i++)
		cout << ans[i] << '\n';

}

Compilation message

antennas.cpp: In lambda function:
antennas.cpp:154:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  154 |    for(auto[x, y]:ev[i]) {
      |            ^
# Verdict Execution time Memory Grader output
1 Correct 11 ms 22220 KB Output is correct
2 Incorrect 12 ms 22292 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 11 ms 22220 KB Output is correct
2 Incorrect 12 ms 22292 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1343 ms 29316 KB Output is correct
2 Correct 1385 ms 30020 KB Output is correct
3 Correct 919 ms 27680 KB Output is correct
4 Correct 1455 ms 29968 KB Output is correct
5 Correct 562 ms 25824 KB Output is correct
6 Correct 1399 ms 29956 KB Output is correct
7 Correct 1183 ms 28980 KB Output is correct
8 Correct 1376 ms 29960 KB Output is correct
9 Correct 172 ms 23492 KB Output is correct
10 Correct 1468 ms 29972 KB Output is correct
11 Correct 765 ms 27092 KB Output is correct
12 Correct 1335 ms 30048 KB Output is correct
13 Correct 1318 ms 30276 KB Output is correct
14 Correct 1184 ms 29932 KB Output is correct
15 Correct 1172 ms 29128 KB Output is correct
16 Correct 1004 ms 29056 KB Output is correct
17 Correct 1374 ms 30716 KB Output is correct
18 Correct 1235 ms 29636 KB Output is correct
19 Correct 1314 ms 29736 KB Output is correct
20 Correct 1278 ms 29816 KB Output is correct
21 Correct 1148 ms 29752 KB Output is correct
22 Correct 1228 ms 29672 KB Output is correct
23 Correct 1286 ms 29864 KB Output is correct
24 Correct 1088 ms 28488 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 11 ms 22220 KB Output is correct
2 Incorrect 12 ms 22292 KB Output isn't correct
3 Halted 0 ms 0 KB -