Submission #365421

#TimeUsernameProblemLanguageResultExecution timeMemory
365421valerikkComparing Plants (IOI20_plants)C++17
0 / 100
66 ms3436 KiB
#include <bits/stdc++.h> using namespace std; const int INF = 1e9 + 100; struct SegTree { struct Data { int mn, pos; void apply(int val) { mn += val; } Data() : mn(INF), pos(-1) {} Data(int mn, int pos) : mn(mn), pos(pos) {} }; Data merge(const Data &l, const Data &r) { return l.mn <= r.mn ? l : r; } int sz; vector<Data> t; vector<int> mod; void apply(int i, int val) { t[i].apply(val); mod[i] += val; } void update(int i) { t[i] = merge(t[2 * i], t[2 * i + 1]); } void push(int i) { apply(2 * i, mod[i]); apply(2 * i + 1, mod[i]); mod[i] = 0; } void modify(int i, int l, int r, int ql, int qr, int val) { if (l >= qr || r <= ql) return; if (l >= ql && r <= qr) { apply(i, val); return; } push(i); int mid = (l + r) / 2; modify(2 * i, l, mid, ql, qr, val); modify(2 * i + 1, mid, r, ql, qr, val); update(i); } void replace_single(int i, int l, int r, int pos, int val) { if (r - l == 1) { t[i] = Data{val, pos}; mod[i] = 0; } else { push(i); int mid = (l + r) / 2; if (pos < mid) replace_single(2 * i, l, mid, pos, val); else replace_single(2 * i + 1, mid, r, pos, val); update(i); } } void replace_single(int pos, int val) { replace_single(1, 0, sz, pos, val); } void modify(int l, int r, int x) { modify(1, 0, sz, l, r, x); } int find_min() { return t[1].pos; } void build(int i, int l, int r, const vector<int> &a) { if (r - l == 1) { t[i] = {a[l], l}; } else { int mid = (l + r) / 2; build(2 * i, l, mid, a); build(2 * i + 1, mid, r, a); update(i); } } SegTree() = default; SegTree(const vector<int> &a) { sz = a.size(); t = vector<Data>(4 * sz); mod = vector<int>(4 * sz, 0); build(1, 0, sz, a); } }; int k, n; vector<int> r; vector<int> h; void build_h() { h = vector<int>(n, -1); SegTree st(r); for (int t = n - 1; t >= 0; t--) { int pos = st.find_min(); h[pos] = t; st.replace_single(pos, INF); if (pos - k + 1 >= 0) st.modify(pos - k + 1, pos, -1); else { st.modify(0, pos, -1); st.modify(n - (k - 1 - pos), n, -1); } } } void init(int k_, vector<int> r_) { n = r_.size(); k = k_; r = r_; build_h(); } int compare_plants(int x, int y) { return h[x] > h[y] ? 1 : -1; } #ifndef EVAL void test() { int n, k, q; cin >> n >> k >> q; vector<int> r(n); for (int i = 0; i < n; i++) cin >> r[i]; init(k, r); for (int i = 0; i < q; i++) { int x, y; cin >> x >> y; cout << compare_plants(x, y) << "\n"; } } int main() { freopen("D:/cp/oi/ioi/2020/input.txt", "r", stdin); ios::sync_with_stdio(false); cin.tie(0); test(); return 0; } #endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...