This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "towers.h"
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
int n;
vector<int> h;
set<int> st;
priority_queue<pair<int, pii> > pq;
vector<pii> q;
void init(int N, std::vector<int> H) {
n = N; h = H;
st.insert(0); st.insert(N - 1);
for(int i = 1; i < N - 1; ++i) {
if(h[i - 1] < h[i] && h[i] > h[i + 1]) st.insert(i);
if(h[i - 1] > h[i] && h[i] < h[i + 1]) st.insert(i);
}
for(auto it = st.begin(); it != st.end(); ++it) {
if(it == st.end()) break;
pq.push({-abs(H[*it] - H[*next(it)]), {*it, *next(it)}});
}
if(st.size() >= 2 && H[*st.begin()] > H[*next(st.begin())]) st.erase(st.begin());
if(st.size() >= 2 && H[*st.rbegin()] > H[*next(st.rbegin())]) st.erase(prev(st.end()));
q.push_back({0, (st.size() - 1) / 2 + 1});
while(!pq.empty()) {
int D = -pq.top().first;
while(!pq.empty() && -pq.top().first == D) {
int i = pq.top().second.first, j = pq.top().second.second;
pq.pop();
if(st.find(i) == st.end() || st.find(j) == st.end()) continue;
st.erase(st.find(i));
st.erase(st.find(j));
if(!st.empty() && *st.begin() < i && *st.rbegin() > j) {
int prv = *prev(st.lower_bound(i));
int nxt = *st.lower_bound(j);
pq.push({-abs(H[prv] - H[nxt]), {prv, nxt}});
}
}
// cout << D << " : ";
// for(auto it : st) cout << it << ' ';
// cout << endl;
q.push_back({D, (st.size() - 1) / 2 + 1});
}
}
int max_towers(int l, int r, int d) {
pii p = {d, -1};
int i = prev(lower_bound(q.begin(), q.end(), p)) - q.begin();
return q[i].second;
}
/*
7 3
10 20 60 40 50 30 70
1 5 10
2 2 100
0 6 17
8 4
20 10 40 30 40 20 30 10
0 6 1
0 6 10
0 6 20
0 6 30
*/
# | 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... |