Submission #1913358


Source Code Expand

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

struct RARM {
	using t1 = int;
	using t2 = int;
	static t1 id1() { return 0; }
	static t2 id2() { return 0; }
	static t1 op1(const t1& l, const t1& r) { return max(l, r); }
	static t1 op2(const t1& l, const t2& r) { return l + r; }
	static t2 op3(const t2& l, const t2& r) { return l + r; }
};

template <typename M>
class LazySegmentTree {
	using T1 = typename M::t1;
	using T2 = typename M::t2;
	const int n;
	vector<T1> data;
	vector<T2> lazy;
	int size(int n) {
		int res = 1;
		while (res < n) res <<= 1;
		return res;
	}
	void push(int node) {
		if (lazy[node] == M::id2()) return;
		if (node < n) {
			lazy[node * 2] = M::op3(lazy[node * 2], lazy[node]);
			lazy[node * 2 + 1] = M::op3(lazy[node * 2 + 1], lazy[node]);
		}
		data[node] = M::op2(data[node], lazy[node]);
		lazy[node] = M::id2();
	}
	void suc(int l, int r, int node, int lb, int ub, T2 val) {
		if (ub <= l || r <= lb) return;
		if (l <= lb && ub <= r) {
			lazy[node] = M::op3(lazy[node], val);
			return;
		}
		push(node);
		int c = (lb + ub) / 2;
		suc(l, r, node * 2, lb, c, val);
		suc(l, r, node * 2 + 1, c, ub, val);
		data[node] = M::op1(M::op2(data[node * 2], lazy[node * 2]), M::op2(data[node * 2 + 1], lazy[node * 2 + 1]));
	}
	T1 sub(int l, int r, int node, int lb, int ub) {
		if (ub <= l || r <= lb) return M::id1();
		if (l <= lb && ub <= r) return M::op2(data[node], lazy[node]);
		push(node);
		int c = (lb + ub) / 2;
		return M::op1(sub(l, r, node * 2, lb, c), sub(l, r, node * 2 + 1, c, ub));
	}
public:
	LazySegmentTree(int n_) : n(size(n_)), data(n * 2, M::id1()), lazy(n * 2, M::id2()) {}
	LazySegmentTree(int n_, T1 v1, T2 v2) : n(size(n_)), data(n * 2, v1), lazy(n * 2, v2) {}
	LazySegmentTree(const vector<T1>& data_) : n(size(data_.size())), data(n * 2, M::id1()), lazy(n * 2, M::id2()) {
		init(data_);
	}
	void init() {
		for (int i = n - 1; i >= 1; i--) data[i] = M::op1(data[i * 2], data[i * 2 + 1]);
	}
	void init(const vector<T1>& data_) {
		for (int i = 0; i < (int)data_.size(); i++) data[i + n] = data_[i];
		init();
	}
	void update(int l, int r, T2 val) {
		suc(l, r + 1, 1, 0, n, val);
	}
	T1 find(int l, int r) {
		return sub(l, r + 1, 1, 0, n);
	}
};

void compress(vector<int>& v, vector<int>& vs) {
	vs = v;
	sort(vs.begin(), vs.end());
	vs.erase(unique(vs.begin(), vs.end()), vs.end());
	for (auto& val : v) {
		val = lower_bound(vs.begin(), vs.end(), val) - vs.begin();
	}
}

int main()
{
	int N;
	cin >> N;
	vector<int> x(N), y(N), L(N);
	vector<tuple<int, int, int>> xyL;
	for (int i = 0; i < N; i++) {
		cin >> x[i] >> y[i] >> L[i];
		xyL.emplace_back(x[i], y[i], L[i]);
	}
	sort(xyL.begin(), xyL.end());
	for (int i = 0; i < N; i++) {
		x[i] = get<0>(xyL[i]);
		y[i] = get<1>(xyL[i]);
		L[i] = get<2>(xyL[i]);
	}
	vector<int> xs, ys, Ls;
	compress(x, xs), compress(y, ys), compress(L, Ls);
	vector<int> rL(N);
	for (int i = 0; i < N; i++) {
		rL[L[i]] = i;
	}
	int res = 0;
	for (int i = N - 1; i >= 0; i--) {
		LazySegmentTree<RARM> lst(N);
		int ni = rL[i];
		int st = lower_bound(xs.begin(), xs.end(), xs[x[ni]] - Ls[i]) - xs.begin();
		int en = upper_bound(xs.begin(), xs.end(), xs[x[ni]] + Ls[i]) - xs.begin();
		for (int l = st, r = st; r < en; r++) {
			if (L[r] >= i) {
				int id = upper_bound(ys.begin(), ys.end(), ys[y[r]] + Ls[i]) - ys.begin() - 1;
				lst.update(y[r], id, 1);
			}
			while (xs[x[r]] - xs[x[l]] > Ls[i]) {
				if (L[l] >= i) {
					int id = upper_bound(ys.begin(), ys.end(), ys[y[l]] + Ls[i]) - ys.begin() - 1;
					lst.update(y[l], id, -1);
				}
				l++;
			}
			res = max(res, lst.find(0, N - 1));
		}
	}
	cout << res << endl;
	return 0;
}

Submission Info

Submission Time
Task starry_sky - 星空 (Starry Sky)
User kazuma
Language C++14 (GCC 5.4.1)
Score 100
Code Size 3768 Byte
Status AC
Exec Time 2210 ms
Memory 512 KB

Judge Result

Set Name Set01 Set02 Set03 Set04 Set05 Set06 Set07 Set08 Set09 Set10 Set11 Set12 Set13 Set14 Set15 Set16 Set17 Set18 Set19 Set20
Score / Max Score 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5
Status
AC × 2
AC × 2
AC × 2
AC × 2
AC × 2
AC × 2
AC × 2
AC × 2
AC × 2
AC × 2
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 2
AC × 1
AC × 2
Set Name Test Cases
Set01 01, 02
Set02 03, 04
Set03 05, 06
Set04 07, 08
Set05 09, 10
Set06 11, 12
Set07 13, 14
Set08 15, 16
Set09 17, 18
Set10 19, 20
Set11 21
Set12 22
Set13 23
Set14 24
Set15 25
Set16 26
Set17 27
Set18 28, 29
Set19 30
Set20 31, 32
Case Name Status Exec Time Memory
01 AC 1 ms 256 KB
02 AC 1 ms 256 KB
03 AC 1 ms 256 KB
04 AC 1 ms 256 KB
05 AC 2 ms 256 KB
06 AC 2 ms 256 KB
07 AC 16 ms 256 KB
08 AC 14 ms 256 KB
09 AC 3 ms 256 KB
10 AC 16 ms 256 KB
11 AC 14 ms 256 KB
12 AC 59 ms 256 KB
13 AC 6 ms 256 KB
14 AC 6 ms 256 KB
15 AC 58 ms 256 KB
16 AC 65 ms 256 KB
17 AC 87 ms 256 KB
18 AC 90 ms 256 KB
19 AC 104 ms 256 KB
20 AC 96 ms 256 KB
21 AC 1623 ms 512 KB
22 AC 1866 ms 512 KB
23 AC 1922 ms 512 KB
24 AC 2081 ms 512 KB
25 AC 1901 ms 512 KB
26 AC 1578 ms 512 KB
27 AC 1769 ms 512 KB
28 AC 2189 ms 512 KB
29 AC 2207 ms 512 KB
30 AC 72 ms 384 KB
31 AC 2210 ms 512 KB
32 AC 2193 ms 512 KB