이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "towers.h"
using namespace std;
const int INF = 2e9;
struct Node {
int mini, arg_max;
};
class Tournament {
int n, offset;
vector <int> vals;
vector <Node> tour;
public:
Node merge(Node lhs, Node rhs) const {
return {min(lhs.mini, rhs.mini), vals[lhs.arg_max] > vals[rhs.arg_max] ? lhs.arg_max : rhs.arg_max};
}
Tournament(int n, vector <int> _vals) : n(n), vals(_vals) {
vals.push_back(0);
for (offset = 1; offset <= n; offset *= 2);
tour.resize(2 * offset);
vals.resize(offset);
for (int i = 0; i < offset; i++)
tour[i + offset] = {vals[i], i};
for (int i = offset - 1; i; i--)
tour[i] = merge(tour[2 * i], tour[2 * i + 1]);
}
Tournament() {}
Node query(int x, int lo, int hi, int from, int to) const {
if (lo >= to || hi <= from)
return {INF, n};
if (lo >= from && hi <= to)
return tour[x];
int mid = (lo + hi) / 2;
return merge(query(2 * x, lo, mid, from, to), query(2 * x + 1, mid, hi, from, to));
}
Node query(int from, int to) const {
return query(1, 0, offset, from, to);
}
int get(int x) const {
return vals[x];
}
};
int N;
Tournament solver;
vector <int> lbs, ubs;
int build_tree(int lo, int hi, int prev) {
if (lo >= hi)
return -INF;
Node tmp = solver.query(lo, hi);
int mid = tmp.arg_max;
int maks = solver.get(mid);
int res = prev - tmp.mini;
lbs.push_back(max(build_tree(lo, mid, maks), build_tree(mid + 1, hi, maks)));
ubs.push_back(res);
return res;
}
void init(int n, vector <int> h) {
N = n;
solver = Tournament(n, h);
build_tree(0, n, INF);
sort(lbs.begin(), lbs.end());
sort(ubs.begin(), ubs.end());
}
int solve(int lo, int hi, int ub, int diff) {
if (lo >= hi)
return 0;
Node tmp = solver.query(lo, hi);
if (tmp.mini > ub)
return 0;
int mid = tmp.arg_max;
int maks = solver.get(mid);
return max(solve(lo, mid, maks - diff, diff) + solve(mid + 1, hi, maks - diff, diff), 1);
}
int get_smaller(const vector <int> &v, int x) {
return lower_bound(v.begin(), v.end(), x) - v.begin();
}
int max_towers(int l, int r, int d) {
if (l == 0 && r == N - 1)
return get_smaller(lbs, d) - get_smaller(ubs, d);
return solve(l, r + 1, INF, d);
}
# | 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... |