제출 #311464

#제출 시각아이디문제언어결과실행 시간메모리
311464IgorI식물 비교 (IOI20_plants)C++17
44 / 100
737 ms13016 KiB
#include <bits/stdc++.h> using namespace std; const int N = 500000; const int INF = 1e9; int c; int n; int H[N]; pair<int, int> tree[4 * N]; int push[4 * N]; pair<int, int> Merge(pair<int, int> a, pair<int, int> b) { return min(a, b); } void Push(int V) { tree[2 * V + 1].first += push[V]; tree[2 * V + 2].first += push[V]; push[2 * V + 1] += push[V]; push[2 * V + 2] += push[V]; push[V] = 0; } void Build(int L, int R, int V, vector<int> &r) { if (L + 1 == R) { tree[V] = {r[L], L}; return; } int M = (L + R) / 2; Build(L, M, 2 * V + 1, r); Build(M, R, 2 * V + 2, r); tree[V] = Merge(tree[2 * V + 1], tree[2 * V + 2]); } pair<int, int> Get(int l, int r, int L = 0, int R = n, int V = 0) { if (r <= L || R <= l) return {INF, 0}; if (l <= L && R <= r) return tree[V]; int M = (L + R) / 2; Push(V); return Merge(Get(l, r, L, M, 2 * V + 1), Get(l, r, M, R, 2 * V + 2)); } void Add(int l, int r, int x, int L = 0, int R = n, int V = 0) { if (r <= L || R <= l) return; if (l <= L && R <= r) { tree[V].first += x; push[V] += x; return; } int M = (L + R) / 2; Push(V); Add(l, r, x, L, M, 2 * V + 1); Add(l, r, x, M, R, 2 * V + 2); tree[V] = Merge(tree[2 * V + 1], tree[2 * V + 2]); } int CGet(int l, int r) { if (l < 0) { l += n; pair<int, int> a = Get(l, n); pair<int, int> b = Get(0, r); if (a.first == 0) return a.second; if (b.first == 0) return b.second; return -1; } pair<int, int> a = Get(l, r); if (a.first == 0) return a.second; return -1; } void CAdd(int l, int r, int x) { if (l < 0) { l += n; Add(l, n, x); Add(0, r, x); } else { Add(l, r, x); } } void call(int i, int k, vector<int> &r, vector<int> &h1) { int id = CGet(i - k + 1, i); while (id != -1) { call(id, k, r, h1); id = CGet(i - k + 1, i); } h1[i] = c--; CAdd(i - k + 1, i, -1); CAdd(i, i + 1, INF); } void init(int k, vector<int> r) { n = r.size(); vector<int> h1(n); c = n; Build(0, n, 0, r); int id = CGet(0, n); while (id != -1) { call(id, k, r, h1); id = CGet(0, n); } for (int i = 0; i < n; i++) { H[i] = h1[i]; //cout << H[i] << " "; } //cout << endl; } int compare_plants(int x, int y) { if (H[x] > H[y]) return 1; return -1; } #ifdef LOCAL int main() { 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); while (q--) { int x, y; cin >> x >> y; cout << compare_plants(x, y) << endl; } } #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...