Submission #422164

#TimeUsernameProblemLanguageResultExecution timeMemory
422164idk321Comparing Plants (IOI20_plants)C++17
32 / 100
508 ms11116 KiB
#include "plants.h" #include <bits/stdc++.h> using namespace std; int k; vector<int> r; vector<int> prefR; const int N = 200005; int tree[4 * N]; int lazy[4 * N]; const int M = 1000000000; int n; int getSum(int from, int to) { int res = prefR[to + 1]; res -= prefR[from]; return res; } void push(int node) { for (int i = 0; i <= 1; i++) { tree[node * 2 +i] += lazy[node]; lazy[node * 2 + i] += lazy[node]; } lazy[node] = 0; } void add(int num, int from, int to, int a, int b, int node) { if (from <= a && b <= to) { tree[node] += num; lazy[node] += num; return; } push(node); int mid = (a + b) / 2; if (from <= mid) add(num, from, to, a, mid, node * 2); if (to > mid) add(num, from, to, mid + 1, b, node * 2+ 1); if (tree[node * 2] <= tree[node * 2 +1]) { tree[node] = tree[node * 2]; } else { tree[node] = tree[node * 2 + 1]; } } int minIndOn(int from, int to, int a, int b, int node) { if(tree[node] != 0) return -1; if (a == b) { return a; } push(node); int mid = (a + b) / 2; int res = -1; if (from <= mid) res = minIndOn(from, to, a, mid, node * 2); if (res == -1 && to > mid) res = minIndOn(from, to, mid + 1, b, node * 2 + 1); return res; } vector<int> order; void init(int K, std::vector<int> R) { k = K; r = R; n = r.size(); prefR.resize(r.size() + 1); for (int i = 1; i <= r.size(); i++) { prefR[i] = r[i - 1]; prefR[i] += prefR[i - 1]; } order.resize(n); if (k == 2) return; for (int i = 0; i < n; i++) { add(r[i], i, i, 0, n - 1, 1); } for (int t = 0; t < n; t++) { int res = -1; int res1 = minIndOn(0, n - 1, 0, n - 1, 1); if (res1 + k <= n - 1) { int res2 = minIndOn(res1 + k, n - 1, 0, n - 1, 1); if (res2 != -1) res = res2; else res = res1; } else res = res1; order[res] = t; add(M, res, res, 0, n - 1, 1); if (res != 0) add(-1, max(0, res - k + 1), res - 1, 0, n - 1, 1); int still = k - (res - max(0, res - k + 1) + 1); if (still > 0) { add(-1, n - still, n - 1, 0, n - 1, 1); } } return; } int compare_plants(int x, int y) { if (k == 2) { if (getSum(x, y - 1) == (y - x)) return -1; if (getSum(x, y - 1) == 0) return 1; int sum1 = getSum(y, n -1); if (x != 0) sum1 += getSum(0, x - 1); if (sum1 == (n - y) + x) return 1; if (sum1 == 0) return -1; return 0; } if (order[x] < order[y]) { return 1; } if (order[x] > order[y]) return -1; return 0; } //3 2 1 4 0 /* 5 3 1 0 1 1 0 2 0 1 */

Compilation message (stderr)

plants.cpp: In function 'void init(int, std::vector<int>)':
plants.cpp:82:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |     for (int i = 1; i <= r.size(); i++)
      |                     ~~^~~~~~~~~~~
#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...