Submission #102105

#TimeUsernameProblemLanguageResultExecution timeMemory
102105mzhaoTwo Antennas (JOI19_antennas)C++11
22 / 100
1092 ms32624 KiB
#include <bits/stdc++.h>
using namespace std;

#ifdef DEBUG
#define D(x...) printf(x)
#else
#define D(x...)
#endif

#define INF 1000000009
#define MX 200009
#define ll long long
#define x first
#define y second

int N, H[MX], A[MX], B[MX], Q, ans = -1;
vector<int> st[MX], en[MX];
vector<pair<int, int>> ev[MX]; // ev[pos] = {index, s/f}

ll t[2][4*MX]; // min tree   max tree

int clamp(int x) {
	x = min(x, N-1);
	x = max(x, 0);
	return x;
}

int cmp(int z, int a, int b) {
	if (z) return max(a, b);
	return min(a, b);
}

ll up(int z, int n, int a, int b, int x, int v) {
	if (b <= x || x < a) return t[z][n];
	if (a == b-1) {
		t[z][n] = v;
	} else t[z][n] = cmp(z, up(z, 2*n, a, (a+b)/2, x, v), up(z, 2*n+1, (a+b)/2, b, x, v));
	return t[z][n];
}

ll qu(int z, int n, int a, int b, int x, int y) {
	if (b <= x || y <= a) return z ? -INF : INF;
	if (x <= a && b <= y) return t[z][n];
	return cmp(z, qu(z, 2*n, a, (a+b)/2, x, y), qu(z, 2*n+1, (a+b)/2, b, x, y));
}

ll query(int z, int x, int y) {
	x = clamp(x); y = clamp(y);
	ll ret = qu(z, 1, 0, N, x, y+1);
	D("query %d %d %d = %lld\n", z, x, y, ret);
	return ret;
}

void update(int z, int x, int v) {
	D("updating %d %d %d\n", z, x, v);
	up(z, 1, 0, N, x, v);
}

int main() {
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {
		scanf("%d%d%d", &H[i], &A[i], &B[i]);
		if (i-A[i] >= 0) {
			st[max(i-B[i], 0)].push_back(i);
			en[i-A[i]+1].push_back(i);
		}
		if (i+A[i] < N) {
			st[i+A[i]].push_back(i);
			en[min(i+B[i]+1, N)].push_back(i);
		}
	}
	scanf("%d", &Q);
	assert(Q == 1);
	for (int i = 0; i < N; i++) {
		up(0, 1, 0, N, i, INF);
		up(1, 1, 0, N, i, -INF);
	}
	for (int i = 0; i < N; i++) {
		for (int j : st[i]) {
			update(0, j, H[j]);
			update(1, j, H[j]);
		}
		for (int j : en[i]) {
			update(0, j, INF);
			update(1, j, -INF);
		}
		int minq = min(query(0, i-B[i], i-A[i]), query(0, i+A[i], i+B[i]));
		int maxq = max(query(1, i-B[i], i-A[i]), query(1, i+A[i], i+B[i]));
		if (minq < INF) ans = max(ans, H[i]-minq);
		if (maxq > -INF) ans = max(ans, maxq-H[i]);
	}
	printf("%d\n", ans);
}

Compilation message (stderr)

antennas.cpp: In function 'int main()':
antennas.cpp:60:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &N);
  ~~~~~^~~~~~~~~~
antennas.cpp:62:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d", &H[i], &A[i], &B[i]);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
antennas.cpp:72:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &Q);
  ~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...