이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "towers.h"
#include <bits/stdc++.h>
using namespace std;
vector<int> h;
vector<int> incers;
int n;
void init(int N, vector<int> H) {
n = N;
h = H;
for (int i = 0; i < n - 1; i++) {
if (h[i] < h[i + 1]) {
incers.push_back(i);
}
}
incers.push_back(n);
}
bool processed = false;
vector<int> nxt, dow;
int max_towers(int l, int r, int D) {
if (!processed) {
deque<pair<int, int>> st;
nxt.resize(n + 1, n);
dow.resize(n + 1, n);
for (int i = n - 1; i >= 0; i--) {
while (!st.empty() && h[st.front().second] <= h[i]) st.pop_front();
st.push_front({h[i], i});
auto p = lower_bound(st.begin(), st.end(), pair{h[i] + D, -1});
if (p != st.end()) {
nxt[i] = p->second;
}
}
for (int i = n - 2; i >= 0; i--) {
nxt[i] = min(nxt[i], nxt[i + 1]);
}
st.clear();
for (int i = n - 1; i >= 0; i--) {
while (!st.empty() && h[st.front().second] >= h[i]) st.pop_back();
st.push_back({h[i], i});
auto p = lower_bound(st.begin(), st.end(), pair{h[i] - D + 1, -1});
if (p != st.begin()) {
p--;
dow[i] = p->second;
}
}
for (int i = n - 2; i >= 0; i--) {
dow[i] = min(dow[i], dow[i + 1]);
}
}
// for (int i = 0; i < n; i++) {
// cout << nxt[i] << " " << dow[i] << "\n";
// }
int p = *lower_bound(incers.begin(), incers.end(), l);
int s = 0;
while (p < r) {
if (s % 2 == 0) {
p = nxt[p];
if (p <= r) {
s++;
}
} else {
p = dow[p];
if (p <= r) {
s++;
}
}
}
return max(1, s / 2 + 1);
}
# | 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... |