#include "towers.h"
#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> arr;
vector<int> upidx, downidx;
struct localmax {
int idx, d, l, r;
bool operator<(const localmax &other) const {
if (d == other.d) return idx < other.idx;
return d < other.d;
}
void update() {
d = arr[upidx[idx]] - max(arr[l], arr[r]);
}
} local_value[101010];
int adj[101010][2];
set<localmax> local;
vector< pair<int, int> > Dlist;
struct Node {
Node *lt, *rt;
int val;
Node() {
lt = rt = NULL;
val = 0;
}
};
Node *root[101010];
int first[101010];
void build(Node *node, int st, int ed) {
if (st == ed) {
node->val = first[st];
return;
}
int mid = (st + ed) / 2;
node->lt = new Node();
node->rt = new Node();
build(node->lt, st, mid);
build(node->rt, mid + 1, ed);
node->val = node->lt->val + node->rt->val;
}
void update(Node *prev, Node *now, int st, int ed, int idx, int value) {
if (st == ed) {
now->val = value;
return;
}
int mid = (st + ed) / 2;
if (idx <= mid) {
now->lt = new Node();
now->rt = prev->rt;
update(prev->lt, now->lt, st, mid, idx, value);
}
else {
now->lt = prev->lt;
now->rt = new Node();
update(prev->rt, now->rt, mid + 1, ed, idx, value);
}
now->val = now->lt->val + now->rt->val;
}
int get(Node *node, int st, int ed, int gs, int ge) {
if (st > ge || ed < gs) return 0;
if (gs <= st && ed <= ge) return node->val;
int mid = (st + ed) / 2;
return get(node->lt, st, mid, gs, ge) + get(node->rt, mid + 1, ed, gs, ge);
}
void init(int N, vector<int> H) {
n = N;
for (int i = 0; i < n; i++) arr.push_back(H[i]);
if (arr[0] < arr[1]) downidx.push_back(0);
for (int i = 1; i < n - 1; i++) {
if (arr[i] > arr[i - 1] && arr[i] > arr[i + 1]) upidx.push_back(i);
if (arr[i] < arr[i - 1] && arr[i] < arr[i + 1]) downidx.push_back(i);
}
if (arr[n - 1] < arr[n - 2]) downidx.push_back(n - 1);
for (int i = 0; i < upidx.size(); i++) {
local_value[i] = {i, 0, downidx[i], downidx[i + 1]};
local_value[i].update();
local.insert(local_value[i]);
adj[i][0] = i - 1;
adj[i][1] = i + 1;
}
while (!local.empty()) {
localmax now = *local.begin();
Dlist.push_back({now.d, upidx[now.idx]});
int next = (arr[now.l] < arr[now.r] ? now.l : now.r);
local.erase(local.begin());
if (adj[now.idx][0] >= 0) {
set<localmax>::iterator iter = local.find(local_value[adj[now.idx][0]]);
if (iter != local.end()) {
local.erase(iter);
local_value[adj[now.idx][0]].r = next;
local_value[adj[now.idx][0]].update();
local.insert(local_value[adj[now.idx][0]]);
adj[adj[now.idx][0]][1] = adj[now.idx][1];
}
}
if (adj[now.idx][1] < upidx.size()) {
set<localmax>::iterator iter = local.find(local_value[adj[now.idx][1]]);
if (iter != local.end()) {
local.erase(iter);
local_value[adj[now.idx][1]].l = next;
local_value[adj[now.idx][1]].update();
local.insert(local_value[adj[now.idx][1]]);
adj[adj[now.idx][1]][0] = adj[now.idx][0];
}
}
}
for (int i = 0; i < upidx.size(); i++) first[upidx[i]] = 1;
root[0] = new Node();
build(root[0], 0, n - 1);
for (int i = 0; i < Dlist.size(); i++) {
root[i + 1] = new Node();
update(root[i], root[i + 1], 0, n - 1, Dlist[i].second, 0);
}
}
int max_towers(int L, int R, int D) {
int d = lower_bound(Dlist.begin(), Dlist.end(), make_pair(D, 0)) - Dlist.begin();
int ans = get(root[d], 0, n - 1, L + 1, R - 1) + 1;
if (arr[L] < arr[L + 1]) {
int st = L, ed = R;
if (get(root[d], 0, n - 1, L, ed) > 0) {
while (st < ed) {
int mid = (st + ed) / 2;
if (get(root[d], 0, n - 1, L, mid) > 0) ed = mid;
else st = mid + 1;
}
if (arr[st] < arr[L] + D) ans--;
}
}
if (arr[R] < arr[R - 1]) {
int st = L, ed = R;
if (get(root[d], 0, n - 1, L, R) > 0) {
while (st < ed) {
int mid = (st + ed + 1) / 2;
if (get(root[d], 0, n - 1, mid, R) > 0) st = mid;
else ed = mid - 1;
}
if (arr[st] < arr[R] + D) ans--;
}
}
return ans;
}
Compilation message
towers.cpp: In function 'void init(int, std::vector<int>)':
towers.cpp:85:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
85 | for (int i = 0; i < upidx.size(); i++) {
| ~~^~~~~~~~~~~~~~
towers.cpp:108:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
108 | if (adj[now.idx][1] < upidx.size()) {
| ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~
towers.cpp:120:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
120 | for (int i = 0; i < upidx.size(); i++) first[upidx[i]] = 1;
| ~~^~~~~~~~~~~~~~
towers.cpp:124:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
124 | for (int i = 0; i < Dlist.size(); i++) {
| ~~^~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
385 ms |
4676 KB |
18th lines differ - on the 1st token, expected: '1', found: '0' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
336 KB |
Output is correct |
2 |
Correct |
2 ms |
720 KB |
Output is correct |
3 |
Incorrect |
2 ms |
720 KB |
1st lines differ - on the 1st token, expected: '91', found: '90' |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
336 KB |
Output is correct |
2 |
Correct |
2 ms |
720 KB |
Output is correct |
3 |
Incorrect |
2 ms |
720 KB |
1st lines differ - on the 1st token, expected: '91', found: '90' |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1069 ms |
27820 KB |
Output is correct |
2 |
Correct |
1302 ms |
28084 KB |
Output is correct |
3 |
Correct |
1262 ms |
28100 KB |
Output is correct |
4 |
Correct |
1554 ms |
38080 KB |
Output is correct |
5 |
Correct |
1483 ms |
38180 KB |
Output is correct |
6 |
Correct |
1383 ms |
38080 KB |
Output is correct |
7 |
Correct |
1547 ms |
38180 KB |
Output is correct |
8 |
Correct |
770 ms |
7724 KB |
Output is correct |
9 |
Correct |
1108 ms |
7712 KB |
Output is correct |
10 |
Correct |
1135 ms |
7752 KB |
Output is correct |
11 |
Correct |
1253 ms |
7744 KB |
Output is correct |
12 |
Correct |
948 ms |
7856 KB |
Output is correct |
13 |
Correct |
964 ms |
7744 KB |
Output is correct |
14 |
Correct |
0 ms |
208 KB |
Output is correct |
15 |
Correct |
1 ms |
464 KB |
Output is correct |
16 |
Correct |
1 ms |
336 KB |
Output is correct |
17 |
Correct |
79 ms |
28088 KB |
Output is correct |
18 |
Correct |
120 ms |
38076 KB |
Output is correct |
19 |
Correct |
123 ms |
38236 KB |
Output is correct |
20 |
Correct |
17 ms |
7716 KB |
Output is correct |
21 |
Correct |
18 ms |
7700 KB |
Output is correct |
22 |
Correct |
89 ms |
28096 KB |
Output is correct |
23 |
Correct |
129 ms |
38176 KB |
Output is correct |
24 |
Correct |
131 ms |
38180 KB |
Output is correct |
25 |
Correct |
18 ms |
7732 KB |
Output is correct |
26 |
Correct |
19 ms |
7712 KB |
Output is correct |
27 |
Correct |
1 ms |
720 KB |
Output is correct |
28 |
Correct |
2 ms |
848 KB |
Output is correct |
29 |
Correct |
2 ms |
848 KB |
Output is correct |
30 |
Correct |
1 ms |
464 KB |
Output is correct |
31 |
Correct |
1 ms |
464 KB |
Output is correct |
32 |
Correct |
1 ms |
720 KB |
Output is correct |
33 |
Correct |
2 ms |
848 KB |
Output is correct |
34 |
Correct |
2 ms |
848 KB |
Output is correct |
35 |
Correct |
1 ms |
464 KB |
Output is correct |
36 |
Correct |
1 ms |
464 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
346 ms |
6480 KB |
3rd lines differ - on the 1st token, expected: '150', found: '149' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
336 KB |
Output is correct |
2 |
Correct |
2 ms |
720 KB |
Output is correct |
3 |
Incorrect |
2 ms |
720 KB |
1st lines differ - on the 1st token, expected: '91', found: '90' |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
385 ms |
4676 KB |
18th lines differ - on the 1st token, expected: '1', found: '0' |
2 |
Halted |
0 ms |
0 KB |
- |