#include <bits/stdc++.h>
#include "towers.h"
using namespace std;
#define fi first
#define se second
typedef long long ll;
typedef long double ld;
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
int inf = 1e9;
int n;
vector<int> h;
vector<int> num;
vector<int> bigger;
vector<int> smaller;
struct segtree{
int sz = 1;
vector<int> tree;
void init() {
while(sz < n) {
sz <<= 1;
}
tree.assign(sz * 2 - 1, 0);
}
void update(int ind, int newq) {
upd(0,0,sz,ind,newq);
}
void upd(int v, int l, int r, int ind, int newq) {
if (r - l == 1) {
tree[v] = newq;
return;
}
int m = (l + r) / 2;
if (ind < m) {
upd(v * 2 + 1, l, m, ind, newq);
} else {
upd(v * 2 + 2, m, r, ind, newq);
}
tree[v] = max(tree[v * 2 + 1] , tree[v * 2 + 2]);
}
int answer(int lq, int rq) {
return ans(0,0,sz, lq, rq);
}
int ans(int v, int l, int r, int lq, int rq) {
if (lq <= l && r <= rq) {
return tree[v];
}
if (lq >= r || rq <= l) {
return 0;
}
int m = (l + r) / 2;
int a1 = ans(v * 2 + 1, l, m, lq, rq),
a2 = ans(v * 2 + 2, m, r, lq, rq);
return max(a1, a2);
}
};
void init(int N, vector<int> H) {
n = N;
h = H;
}
int max_towers(int l, int r, int d) {
num.assign(n, 0);
bigger.assign(n, 0);
smaller.assign(n, 0);
vector<pair<int, int>> vec;
for (int i= 0 ; i < n; i++) {
vec.push_back({h[i], i});
}
sort(vec.begin(), vec.end());
for (int i = 0; i < n; i++) {
num[vec[i].se] = i;
smaller[i] = -1;
bigger[i] = inf;
int l = 0, r = i;
while (r - l > 1) {
int mid = (l + r) / 2;
if (vec[mid].fi + d <= vec[i].fi) {
l = mid;
} else {
r = mid;
}
}
if (vec[l].fi + d <= vec[i].fi) {
smaller[i] = l;
}
l = i, r = n - 1;
while (r - l > 1) {
int mid = (l + r) / 2;
if (vec[i].fi + d <= vec[mid].fi) {
r = mid;
} else {
l = mid;
}
}
if (vec[i].fi + d <= vec[r].fi) {
bigger[i] = r;
}
}
segtree treefi, treese;
treefi.init();
treese.init();
vector<pair<int, int>> dp(n, {1, 0});
int res = 0;
for (int i = l; i <= r; i++) {
int ind = num[i];
if (smaller[ind] != -1) {
dp[i].se = max(dp[i].se, treefi.answer(0, smaller[ind] + 1));
treese.update(ind, dp[i].se);
}
if (bigger[ind] != inf) {
dp[i].fi = max(dp[i].fi, treese.answer(bigger[ind], n) + 1);
treefi.update(ind, dp[i].fi);
}
res = max(res, dp[i].fi);
}
return res;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |