Submission #60706935
Source Code Expand
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF = 1012345678;
class sparse_table {
private:
vector<vector<int> > v;
public:
sparse_table() : v() {}
sparse_table(const vector<int>& a) {
int n = a.size();
int bits = (n >= 3 ? 32 - __builtin_clz(n - 1) : 1);
v = vector<vector<int> >(bits);
v[0] = a;
for (int i = 1; i < bits; i++) {
v[i].resize(n - (1 << i) + 1);
for (int j = 0; j <= n - (1 << i); j++) {
v[i][j] = max(v[i - 1][j], v[i - 1][j + (1 << (i - 1))]);
}
}
}
int range_max(int l, int r) const {
if (l >= r) {
return -INF;
}
int b = (r - l >= 3 ? 31 - __builtin_clz(r - l - 1) : 0);
return max(v[b][l], v[b][r - (1 << b)]);
}
};
class segment_tree {
private:
int size;
vector<int> val;
vector<int> lazy;
void push(int k) {
if (lazy[k] != 0) {
val[k] += lazy[k];
if (k < size) {
lazy[k * 2 + 0] += lazy[k];
lazy[k * 2 + 1] += lazy[k];
}
lazy[k] = 0;
}
}
public:
segment_tree() : size(0), val(), lazy() {}
segment_tree(int n) : size(1 << (n >= 2 ? 32 - __builtin_clz(n - 1) : 0)) {
val = vector<int>(size * 2, 0);
lazy = vector<int>(size * 2, 0);
}
void range_add(int l, int r, int x) {
auto recur = [&](auto& self, int k, int s, int t) -> void {
if (l <= s && t <= r) {
lazy[k] += x;
push(k);
return;
}
push(k);
if (r <= s || t <= l) {
return;
}
self(self, k * 2 + 0, s, (s + t) / 2);
self(self, k * 2 + 1, (s + t) / 2, t);
val[k] = max(val[k * 2 + 0], val[k * 2 + 1]);
};
recur(recur, 1, 0, size);
}
int range_max(int l, int r) {
auto recur = [&](auto& self, int k, int s, int t) -> int {
push(k);
if (l <= s && t <= r) {
return val[k];
}
if (r <= s || t <= l) {
return -INF;
}
int lc = self(self, k * 2 + 0, s, (s + t) / 2);
int rc = self(self, k * 2 + 1, (s + t) / 2, t);
val[k] = max(val[k * 2 + 0], val[k * 2 + 1]);
return max(lc, rc);
};
return recur(recur, 1, 0, size);
}
};
int solve(int N, const vector<int>& X, const vector<int>& A) {
vector<int> XA1(N), XA2(N);
for (int i = 0; i < N; i++) {
XA1[i] = A[i] + X[i];
XA2[i] = A[i] - X[i];
}
sparse_table sp1(XA1), sp2(XA2);
vector<int> L(N), R(N);
for (int i = 0; i < N; i++) {
int la = -1, ra = i;
while (ra - la > 1) {
int m = (la + ra) / 2;
if (sp1.range_max(m, i) > X[i] + A[i]) {
la = m;
} else {
ra = m;
}
}
L[i] = ra;
int pos = lower_bound(X.begin(), X.end(), X[i] + A[i]) - X.begin();
if (sp1.range_max(i + 1, pos) >= X[i] + A[i]) {
int lb = i, rb = pos;
while (rb - lb > 1) {
int m = (lb + rb) / 2;
if (sp1.range_max(i + 1, m) >= X[i] + A[i]) {
rb = m;
} else {
lb = m;
}
}
R[i] = lb - 1;
} else {
int lc = pos, rc = N + 1;
while (rc - lc > 1) {
int m = (lc + rc) / 2;
if (sp2.range_max(pos, m) >= -(X[i] + A[i])) {
rc = m;
} else {
lc = m;
}
}
R[i] = lc - 1;
}
}
vector<vector<int> > dec(N);
for (int i = 0; i < N; i++) {
dec[R[i]].push_back(i);
}
int ans = 0;
segment_tree seg(N);
for (int i = 0; i < N; i++) {
seg.range_add(L[i], i + 1, 1);
int subans = seg.range_max(0, N);
ans = max(ans, subans);
for (int j : dec[i]) {
seg.range_add(L[j], j + 1, -1);
}
}
return ans;
}
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
int T;
cin >> T;
for (int id = 1; id <= T; id++) {
int N;
cin >> N;
vector<int> X(N), A(N);
for (int i = 0; i < N; i++) {
cin >> X[i] >> A[i];
}
int ans = solve(N, X, A);
cout << ans << '\n';
}
return 0;
}
Submission Info
Submission Time |
|
Task |
D - Shooting the Stars |
User |
square1001 |
Language |
C++ 20 (gcc 12.2) |
Score |
1000 |
Code Size |
3770 Byte |
Status |
AC |
Exec Time |
240 ms |
Memory |
48956 KiB |
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
1000 / 1000 |
Status |
|
|
Set Name |
Test Cases |
Sample |
sample-01.txt |
All |
in01.txt, in02.txt, in03.txt, in04.txt, in05.txt, in06.txt, in07.txt, in08.txt, in09.txt, in10.txt, in11.txt, in12.txt, in13.txt, in14.txt, in15.txt, in16.txt, in17.txt, in18.txt, in19.txt, in20.txt, in21.txt, in22.txt, in23.txt, in24.txt, in25.txt, in26.txt, in27.txt, in28.txt, in29.txt, in30.txt, in31.txt, in32.txt, in33.txt, in34.txt, in35.txt, in36.txt, in37.txt, in38.txt, in39.txt, in40.txt, in41.txt, in42.txt, in43.txt, in44.txt, in45.txt, in46.txt, in47.txt, in48.txt, in49.txt, sample-01.txt |
Case Name |
Status |
Exec Time |
Memory |
in01.txt |
AC |
69 ms |
3504 KiB |
in02.txt |
AC |
230 ms |
46088 KiB |
in03.txt |
AC |
217 ms |
46048 KiB |
in04.txt |
AC |
93 ms |
3556 KiB |
in05.txt |
AC |
66 ms |
3448 KiB |
in06.txt |
AC |
65 ms |
3556 KiB |
in07.txt |
AC |
55 ms |
3480 KiB |
in08.txt |
AC |
62 ms |
3372 KiB |
in09.txt |
AC |
59 ms |
3484 KiB |
in10.txt |
AC |
59 ms |
3412 KiB |
in11.txt |
AC |
53 ms |
3552 KiB |
in12.txt |
AC |
63 ms |
3388 KiB |
in13.txt |
AC |
61 ms |
3504 KiB |
in14.txt |
AC |
92 ms |
3584 KiB |
in15.txt |
AC |
115 ms |
3844 KiB |
in16.txt |
AC |
139 ms |
5280 KiB |
in17.txt |
AC |
155 ms |
19688 KiB |
in18.txt |
AC |
225 ms |
45264 KiB |
in19.txt |
AC |
213 ms |
45408 KiB |
in20.txt |
AC |
197 ms |
44976 KiB |
in21.txt |
AC |
185 ms |
44880 KiB |
in22.txt |
AC |
231 ms |
46728 KiB |
in23.txt |
AC |
196 ms |
46496 KiB |
in24.txt |
AC |
185 ms |
48912 KiB |
in25.txt |
AC |
186 ms |
48908 KiB |
in26.txt |
AC |
172 ms |
43620 KiB |
in27.txt |
AC |
90 ms |
3624 KiB |
in28.txt |
AC |
115 ms |
3900 KiB |
in29.txt |
AC |
146 ms |
5368 KiB |
in30.txt |
AC |
170 ms |
14268 KiB |
in31.txt |
AC |
212 ms |
45680 KiB |
in32.txt |
AC |
93 ms |
3504 KiB |
in33.txt |
AC |
119 ms |
3848 KiB |
in34.txt |
AC |
145 ms |
5272 KiB |
in35.txt |
AC |
160 ms |
17988 KiB |
in36.txt |
AC |
217 ms |
45744 KiB |
in37.txt |
AC |
181 ms |
45812 KiB |
in38.txt |
AC |
167 ms |
46456 KiB |
in39.txt |
AC |
194 ms |
45728 KiB |
in40.txt |
AC |
1 ms |
3376 KiB |
in41.txt |
AC |
188 ms |
48956 KiB |
in42.txt |
AC |
182 ms |
48956 KiB |
in43.txt |
AC |
240 ms |
43604 KiB |
in44.txt |
AC |
173 ms |
43548 KiB |
in45.txt |
AC |
205 ms |
43752 KiB |
in46.txt |
AC |
171 ms |
35792 KiB |
in47.txt |
AC |
194 ms |
41688 KiB |
in48.txt |
AC |
136 ms |
29744 KiB |
in49.txt |
AC |
169 ms |
37316 KiB |
sample-01.txt |
AC |
1 ms |
3468 KiB |