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 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |