#include <algorithm>
#include <optional>
#include <unordered_set>
#include <vector>
#include <map>
#include <queue>
int n;
std::vector<int> h;
int max_idx;
std::map<int, int> data;
void init(int N, std::vector<int> H) {
n = N;
h = H;
max_idx = 0;
for (int i = 1; i < N; i++) {
if (H[i] > H[max_idx]) {
max_idx = i;
}
}
int towers = 0;
struct D {
int prev;
int max_to_prev;
int next;
int max_to_next;
};
std::vector<D> adj;
for (int i = 0; i < N; i++) {
towers += 1;
int max_to_prev = H[i];
int max_to_next = H[i];
if (i != 0) max_to_prev = std::max(max_to_prev, H[i - 1]);
if (i + 1 != N) max_to_next = std::max(max_to_next, H[i + 1]);
adj.push_back({.prev = i - 1,
.max_to_prev = max_to_prev,
.next = i + 1 == N ? -1 : i + 1,
.max_to_next = max_to_next});
}
struct PQItem {
int priority;
int from;
int to;
bool operator<(const PQItem &rhs) const {
return priority > rhs.priority;
}
};
std::vector<bool> active(adj.size(), true);
std::priority_queue<PQItem> pq;
for (int i = 1; i < adj.size(); i++) {
pq.push({.priority = 0, .from = i - 1, .to = i});
}
while (!pq.empty()) {
auto [priority, from, to] = pq.top();
pq.pop();
if (!active[from] || !active[to]) continue;
data.emplace(priority, towers);
if (H[from] > H[to]) {
int max = adj[to].max_to_prev =
std::max(adj[from].max_to_prev, adj[to].max_to_prev);
adj[to].prev = adj[from].prev;
if (adj[to].prev != -1) {
adj[adj[to].prev].next = to;
pq.push({.priority = max - std::max(H[adj[to].prev], H[to]),
.from = adj[to].prev,
.to = to});
}
towers -= 1;
active[from] = false;
} else {
int max = adj[from].max_to_next =
std::max(adj[from].max_to_next, adj[to].max_to_next);
adj[from].next = adj[to].next;
if (adj[from].next != -1) {
adj[adj[from].next].prev = from;
pq.push({.priority = max - std::max(H[from], H[adj[from].next]),
.from = from,
.to = adj[from].next});
}
towers -= 1;
active[to] = false;
}
}
data.emplace(2'000'000'000, towers);
}
template <typename Node>
struct SegmentTree {
std::vector<Node> nodes;
int offset;
explicit SegmentTree(int sz) : nodes(2 * sz), offset(sz) {}
void update(int idx, const Node &node) {
idx += offset;
nodes[idx] = node;
while (idx /= 2) {
nodes[idx] = nodes[2 * idx] * nodes[2 * idx + 1];
}
}
Node query(int l, int r) const {
Node left, right;
l += offset;
r += offset;
while (l < r) {
if (l & 1) left = left * nodes[l++];
if (r & 1) right = nodes[--r] * right;
l >>= 1;
r >>= 1;
}
return left * right;
}
};
int d;
struct LeftNode {
int a, b, min, max;
LeftNode() : a(-1), b(-1), min(2'000'000'000), max(-2'000'000'000) {}
LeftNode(int a) : a(-1), b(-1), min(a), max(a) {}
LeftNode(int a, int b, int min, int max) : a(a), b(b), min(min), max(max) {}
LeftNode operator*(const LeftNode &rhs) const {
std::pair<int, int> c1 = {b, a};
std::pair<int, int> c2 = {rhs.b, rhs.a};
std::pair<int, int> c3 = {-1, -1};
if (rhs.max >= 0 && rhs.max - min >= d) {
c3 = {rhs.max, min};
}
std::pair<int, int> best = std::max(std::max(c1, c2), c3);
return {best.second, best.first, std::min(min, rhs.min),
std::max(max, rhs.max)};
}
};
struct RightNode {
int a, b, min, max;
RightNode() : a(-1), b(-1), min(2'000'000'000), max(-2'000'000'000) {}
RightNode(int a) : a(-1), b(-1), min(a), max(a) {}
RightNode(int a, int b, int min, int max)
: a(a), b(b), min(min), max(max) {}
RightNode operator*(const RightNode &rhs) const {
std::pair<int, int> c1 = {b, a};
std::pair<int, int> c2 = {rhs.b, rhs.a};
std::pair<int, int> c3 = {-1, -1};
if (max >= 0 && max - rhs.min >= d) {
c3 = {max, rhs.min};
}
std::pair<int, int> best = std::max(std::max(c1, c2), c3);
return {best.second, best.first, std::min(min, rhs.min),
std::max(max, rhs.max)};
}
};
struct PrecomputedData {
std::unordered_set<int> included_s;
std::vector<int> prefix_sums, prev, next;
SegmentTree<LeftNode> left_st;
SegmentTree<RightNode> right_st;
};
std::optional<PrecomputedData> precomputed;
int max_towers(int L, int R, int D) {
if (L == R) return 1;
R += 1;
precomputed.reset();
if (!precomputed) {
d = D;
std::vector<int> included{h[0]};
int intermediary = h[0];
for (int i = 1; i < n; i++) {
if (h[i] > intermediary) {
intermediary = h[i];
} else if (intermediary - included.back() < D) {
if (h[i] < included.back()) {
included.pop_back();
included.push_back(h[i]);
intermediary = h[i];
}
} else if (intermediary - h[i] >= D) {
included.push_back(h[i]);
intermediary = h[i];
}
}
std::unordered_set<int> included_s(included.begin(), included.end());
std::vector<int> prev, next;
int prev_val = -1;
for (int i = 0; i < n; i++) {
if (included_s.count(h[i])) {
prev_val = i;
}
prev.push_back(prev_val);
}
int next_val = -1;
for (int i = n - 1; i >= 0; i--) {
if (included_s.count(h[i])) {
next_val = i;
}
next.push_back(next_val);
}
std::reverse(next.begin(), next.end());
std::vector<int> prefix_sums{1};
prefix_sums.reserve(n + 1);
for (int i = 0; i < n; i++) {
prefix_sums.push_back(prefix_sums.back() + included_s.count(h[i]));
}
int o = 1;
while (o < n) o *= 2;
SegmentTree<LeftNode> left_st(o);
SegmentTree<RightNode> right_st(o);
for (int i = 0; i < n; i++) {
left_st.update(i, LeftNode(h[i]));
right_st.update(i, RightNode(h[i]));
}
precomputed = std::make_optional(PrecomputedData{
included_s, prefix_sums, prev, next, left_st, right_st});
}
if (L == 0 && R + 1 == n) {
return data.lower_bound(D)->second;
}
if (D != d) {
if (R - 1 <= max_idx) {
return 1;
}
if (L >= max_idx) {
return 1;
}
int a = h[L];
int b = h[R - 1];
int c = h[max_idx];
if (c - a >= D && c - b >= D) {
return 2;
} else {
return 1;
}
}
int total = precomputed->prefix_sums[R] - precomputed->prefix_sums[L];
int next = precomputed->next[L];
auto q0 = precomputed->left_st.query(L, next);
if (q0.b - h[next] >= D) {
total += 1;
}
int prev = precomputed->prev[R - 1];
auto q1 = precomputed->right_st.query(prev + 1, R);
if (q1.b - h[prev] >= D) {
total += 1;
}
return std::max(total, 1);
}
Compilation message
towers.cpp: In function 'void init(int, std::vector<int>)':
towers.cpp:59:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<init(int, std::vector<int>)::D>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
59 | for (int i = 1; i < adj.size(); i++) {
| ~~^~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
4046 ms |
10532 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
336 KB |
Output is correct |
2 |
Correct |
2 ms |
592 KB |
Output is correct |
3 |
Correct |
1 ms |
592 KB |
Output is correct |
4 |
Correct |
2 ms |
720 KB |
Output is correct |
5 |
Correct |
1 ms |
592 KB |
Output is correct |
6 |
Correct |
2 ms |
592 KB |
Output is correct |
7 |
Correct |
2 ms |
592 KB |
Output is correct |
8 |
Correct |
1 ms |
592 KB |
Output is correct |
9 |
Correct |
1 ms |
620 KB |
Output is correct |
10 |
Correct |
1 ms |
592 KB |
Output is correct |
11 |
Correct |
1 ms |
592 KB |
Output is correct |
12 |
Correct |
0 ms |
208 KB |
Output is correct |
13 |
Correct |
1 ms |
592 KB |
Output is correct |
14 |
Correct |
1 ms |
592 KB |
Output is correct |
15 |
Correct |
2 ms |
604 KB |
Output is correct |
16 |
Correct |
2 ms |
720 KB |
Output is correct |
17 |
Correct |
2 ms |
720 KB |
Output is correct |
18 |
Correct |
1 ms |
592 KB |
Output is correct |
19 |
Correct |
1 ms |
592 KB |
Output is correct |
20 |
Correct |
2 ms |
592 KB |
Output is correct |
21 |
Correct |
2 ms |
720 KB |
Output is correct |
22 |
Correct |
2 ms |
720 KB |
Output is correct |
23 |
Correct |
1 ms |
592 KB |
Output is correct |
24 |
Correct |
1 ms |
592 KB |
Output is correct |
25 |
Correct |
1 ms |
336 KB |
Output is correct |
26 |
Correct |
1 ms |
592 KB |
Output is correct |
27 |
Correct |
2 ms |
592 KB |
Output is correct |
28 |
Correct |
1 ms |
592 KB |
Output is correct |
29 |
Correct |
2 ms |
592 KB |
Output is correct |
30 |
Correct |
1 ms |
592 KB |
Output is correct |
31 |
Correct |
1 ms |
592 KB |
Output is correct |
32 |
Correct |
1 ms |
592 KB |
Output is correct |
33 |
Correct |
1 ms |
592 KB |
Output is correct |
34 |
Correct |
1 ms |
592 KB |
Output is correct |
35 |
Correct |
2 ms |
592 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
336 KB |
Output is correct |
2 |
Correct |
2 ms |
592 KB |
Output is correct |
3 |
Correct |
1 ms |
592 KB |
Output is correct |
4 |
Correct |
2 ms |
720 KB |
Output is correct |
5 |
Correct |
1 ms |
592 KB |
Output is correct |
6 |
Correct |
2 ms |
592 KB |
Output is correct |
7 |
Correct |
2 ms |
592 KB |
Output is correct |
8 |
Correct |
1 ms |
592 KB |
Output is correct |
9 |
Correct |
1 ms |
620 KB |
Output is correct |
10 |
Correct |
1 ms |
592 KB |
Output is correct |
11 |
Correct |
1 ms |
592 KB |
Output is correct |
12 |
Correct |
0 ms |
208 KB |
Output is correct |
13 |
Correct |
1 ms |
592 KB |
Output is correct |
14 |
Correct |
1 ms |
592 KB |
Output is correct |
15 |
Correct |
2 ms |
604 KB |
Output is correct |
16 |
Correct |
2 ms |
720 KB |
Output is correct |
17 |
Correct |
2 ms |
720 KB |
Output is correct |
18 |
Correct |
1 ms |
592 KB |
Output is correct |
19 |
Correct |
1 ms |
592 KB |
Output is correct |
20 |
Correct |
2 ms |
592 KB |
Output is correct |
21 |
Correct |
2 ms |
720 KB |
Output is correct |
22 |
Correct |
2 ms |
720 KB |
Output is correct |
23 |
Correct |
1 ms |
592 KB |
Output is correct |
24 |
Correct |
1 ms |
592 KB |
Output is correct |
25 |
Correct |
1 ms |
336 KB |
Output is correct |
26 |
Correct |
1 ms |
592 KB |
Output is correct |
27 |
Correct |
2 ms |
592 KB |
Output is correct |
28 |
Correct |
1 ms |
592 KB |
Output is correct |
29 |
Correct |
2 ms |
592 KB |
Output is correct |
30 |
Correct |
1 ms |
592 KB |
Output is correct |
31 |
Correct |
1 ms |
592 KB |
Output is correct |
32 |
Correct |
1 ms |
592 KB |
Output is correct |
33 |
Correct |
1 ms |
592 KB |
Output is correct |
34 |
Correct |
1 ms |
592 KB |
Output is correct |
35 |
Correct |
2 ms |
592 KB |
Output is correct |
36 |
Correct |
55 ms |
13196 KB |
Output is correct |
37 |
Correct |
78 ms |
21980 KB |
Output is correct |
38 |
Correct |
91 ms |
23220 KB |
Output is correct |
39 |
Correct |
77 ms |
22376 KB |
Output is correct |
40 |
Correct |
91 ms |
25520 KB |
Output is correct |
41 |
Correct |
86 ms |
24124 KB |
Output is correct |
42 |
Correct |
91 ms |
26316 KB |
Output is correct |
43 |
Correct |
57 ms |
20160 KB |
Output is correct |
44 |
Correct |
62 ms |
20156 KB |
Output is correct |
45 |
Correct |
61 ms |
20168 KB |
Output is correct |
46 |
Correct |
64 ms |
20156 KB |
Output is correct |
47 |
Correct |
94 ms |
24128 KB |
Output is correct |
48 |
Correct |
91 ms |
26248 KB |
Output is correct |
49 |
Correct |
93 ms |
26304 KB |
Output is correct |
50 |
Correct |
67 ms |
20184 KB |
Output is correct |
51 |
Correct |
70 ms |
20156 KB |
Output is correct |
52 |
Correct |
87 ms |
24148 KB |
Output is correct |
53 |
Correct |
90 ms |
26364 KB |
Output is correct |
54 |
Correct |
90 ms |
26256 KB |
Output is correct |
55 |
Correct |
67 ms |
20204 KB |
Output is correct |
56 |
Correct |
62 ms |
20096 KB |
Output is correct |
57 |
Correct |
81 ms |
22204 KB |
Output is correct |
58 |
Correct |
83 ms |
22936 KB |
Output is correct |
59 |
Correct |
85 ms |
23484 KB |
Output is correct |
60 |
Correct |
91 ms |
26272 KB |
Output is correct |
61 |
Correct |
92 ms |
25740 KB |
Output is correct |
62 |
Correct |
87 ms |
24548 KB |
Output is correct |
63 |
Correct |
89 ms |
25688 KB |
Output is correct |
64 |
Correct |
56 ms |
20184 KB |
Output is correct |
65 |
Correct |
62 ms |
20160 KB |
Output is correct |
66 |
Correct |
72 ms |
20292 KB |
Output is correct |
67 |
Correct |
63 ms |
20176 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
4035 ms |
24260 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
4088 ms |
6252 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
336 KB |
Output is correct |
2 |
Correct |
2 ms |
592 KB |
Output is correct |
3 |
Correct |
1 ms |
592 KB |
Output is correct |
4 |
Correct |
2 ms |
720 KB |
Output is correct |
5 |
Correct |
1 ms |
592 KB |
Output is correct |
6 |
Correct |
2 ms |
592 KB |
Output is correct |
7 |
Correct |
2 ms |
592 KB |
Output is correct |
8 |
Correct |
1 ms |
592 KB |
Output is correct |
9 |
Correct |
1 ms |
620 KB |
Output is correct |
10 |
Correct |
1 ms |
592 KB |
Output is correct |
11 |
Correct |
1 ms |
592 KB |
Output is correct |
12 |
Correct |
0 ms |
208 KB |
Output is correct |
13 |
Correct |
1 ms |
592 KB |
Output is correct |
14 |
Correct |
1 ms |
592 KB |
Output is correct |
15 |
Correct |
2 ms |
604 KB |
Output is correct |
16 |
Correct |
2 ms |
720 KB |
Output is correct |
17 |
Correct |
2 ms |
720 KB |
Output is correct |
18 |
Correct |
1 ms |
592 KB |
Output is correct |
19 |
Correct |
1 ms |
592 KB |
Output is correct |
20 |
Correct |
2 ms |
592 KB |
Output is correct |
21 |
Correct |
2 ms |
720 KB |
Output is correct |
22 |
Correct |
2 ms |
720 KB |
Output is correct |
23 |
Correct |
1 ms |
592 KB |
Output is correct |
24 |
Correct |
1 ms |
592 KB |
Output is correct |
25 |
Correct |
1 ms |
336 KB |
Output is correct |
26 |
Correct |
1 ms |
592 KB |
Output is correct |
27 |
Correct |
2 ms |
592 KB |
Output is correct |
28 |
Correct |
1 ms |
592 KB |
Output is correct |
29 |
Correct |
2 ms |
592 KB |
Output is correct |
30 |
Correct |
1 ms |
592 KB |
Output is correct |
31 |
Correct |
1 ms |
592 KB |
Output is correct |
32 |
Correct |
1 ms |
592 KB |
Output is correct |
33 |
Correct |
1 ms |
592 KB |
Output is correct |
34 |
Correct |
1 ms |
592 KB |
Output is correct |
35 |
Correct |
2 ms |
592 KB |
Output is correct |
36 |
Correct |
55 ms |
13196 KB |
Output is correct |
37 |
Correct |
78 ms |
21980 KB |
Output is correct |
38 |
Correct |
91 ms |
23220 KB |
Output is correct |
39 |
Correct |
77 ms |
22376 KB |
Output is correct |
40 |
Correct |
91 ms |
25520 KB |
Output is correct |
41 |
Correct |
86 ms |
24124 KB |
Output is correct |
42 |
Correct |
91 ms |
26316 KB |
Output is correct |
43 |
Correct |
57 ms |
20160 KB |
Output is correct |
44 |
Correct |
62 ms |
20156 KB |
Output is correct |
45 |
Correct |
61 ms |
20168 KB |
Output is correct |
46 |
Correct |
64 ms |
20156 KB |
Output is correct |
47 |
Correct |
94 ms |
24128 KB |
Output is correct |
48 |
Correct |
91 ms |
26248 KB |
Output is correct |
49 |
Correct |
93 ms |
26304 KB |
Output is correct |
50 |
Correct |
67 ms |
20184 KB |
Output is correct |
51 |
Correct |
70 ms |
20156 KB |
Output is correct |
52 |
Correct |
87 ms |
24148 KB |
Output is correct |
53 |
Correct |
90 ms |
26364 KB |
Output is correct |
54 |
Correct |
90 ms |
26256 KB |
Output is correct |
55 |
Correct |
67 ms |
20204 KB |
Output is correct |
56 |
Correct |
62 ms |
20096 KB |
Output is correct |
57 |
Correct |
81 ms |
22204 KB |
Output is correct |
58 |
Correct |
83 ms |
22936 KB |
Output is correct |
59 |
Correct |
85 ms |
23484 KB |
Output is correct |
60 |
Correct |
91 ms |
26272 KB |
Output is correct |
61 |
Correct |
92 ms |
25740 KB |
Output is correct |
62 |
Correct |
87 ms |
24548 KB |
Output is correct |
63 |
Correct |
89 ms |
25688 KB |
Output is correct |
64 |
Correct |
56 ms |
20184 KB |
Output is correct |
65 |
Correct |
62 ms |
20160 KB |
Output is correct |
66 |
Correct |
72 ms |
20292 KB |
Output is correct |
67 |
Correct |
63 ms |
20176 KB |
Output is correct |
68 |
Execution timed out |
4035 ms |
24260 KB |
Time limit exceeded |
69 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
4046 ms |
10532 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |