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 "plants.h"
#include <bits/stdc++.h>
using namespace std;
struct segment_tree {
int l, r, m, v, t;
segment_tree *c[2];
segment_tree(int l, int r,
const vector <int> &a):
l(l), r(r), m((l + r) / 2), t(0) {
if (l + 1 == r) {
v = a[l]; return;
}
c[0] = new segment_tree(l, m, a);
c[1] = new segment_tree(m, r, a);
pull();
}
void apply(int x) {
v -= x; t -= x;
}
void pull() {
v = min(c[0]->v, c[1]->v);
}
void push() {
c[0]->apply(t);
c[1]->apply(t); t = 0;
}
void dec(int x, int y) {
if (x == y) return;
if (l >= x && r <= y)
return apply(1);
push();
if (m > x) c[0]->dec(x, y);
if (m < y) c[1]->dec(x, y);
pull();
}
void del(int p) {
if (l + 1 == r) v = 1e9;
else {
push();
if (m > p) c[0]->del(p);
else c[1]->del(p);
pull();
}
}
int zero() {
if (l + 1 == r) return l;
if (!c[0]->v)
return c[0]->zero();
return c[1]->zero();
}
};
void build(int k, vector <int> r,
vector <int> &idx, vector <int> &ptr) {
int n = r.size();
ptr.resize(n + 1);
idx.resize(n + 1);
vector <int> que(n + 1);
que[0] = n; idx[n] = -1;
int first = 1, last = 1;
segment_tree seg(0, n, r);
for (int i = 0, p; i < n; i++) {
while (seg.v) {
p = que[first++];
seg.dec(p - k + n + 1, n);
}
p = seg.zero(); idx[p] = i;
seg.del(p);
if (p < k - 1)
seg.dec(0, que[last++] = p);
else seg.dec(p - k + 1, p);
ptr[p] = idx[que[first - 1]];
}
}
vector <int> idxg, idxl;
vector <int> ptrg, ptrl;
void init(int k, vector <int> r) {
build(k, r, idxg, ptrg);
for (int &x : r) x = k - 1 - x;
build(k, r, idxl, ptrl);
return;
}
int compare_plants(int x, int y) {
if (x > y)
return -compare_plants(y, x);
if (idxg[x] > idxg[y] ||
ptrl[y] >= idxl[x]) return -1;
if (idxl[x] > idxl[y] ||
ptrg[y] >= idxg[x]) return 1;
return 0;
}
# | 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... |