Submission #889443

#TimeUsernameProblemLanguageResultExecution timeMemory
889443upedGrowing Trees (BOI11_grow)C++17
100 / 100
492 ms7508 KiB
#include <bits/stdc++.h> using namespace std; #define DEBUG(a) cout << #a << ": " << a << '\n'; using ll = long long; struct lazy_segtree { using T = ll; using U = ll; T value_identity = 0ll; U operation_identity = 0ll; U compose(U a, U b) { return a + b; } T apply(T a, U b, int n) { return a + b * n; } T combine(T a, T b) { return a + b; } int size; vector<T> tree; vector<U> operations; lazy_segtree(int n) { size = 1; while (size < n) size *= 2; tree.assign(2 * size, value_identity); operations.assign(2 * size, operation_identity); } void propagate(int x, int lx, int rx) { if (rx - lx == 1) { return; } int m = (lx + rx) / 2; operations[2 * x + 1] = compose(operations[2 * x + 1], operations[x]); operations[2 * x + 2] = compose(operations[2 * x + 2], operations[x]); tree[2 * x + 1] = apply(tree[2 * x + 1], operations[x], m - lx); tree[2 * x + 2] = apply(tree[2 * x + 2], operations[x], rx - m); operations[x] = operation_identity; } void modify(int l, int r, int v, int x, int lx, int rx) { propagate(x, lx, rx); if (lx >= r || rx <= l) return; if (l <= lx && rx <= r) { operations[x] = compose(operations[x], v); tree[x] = apply(tree[x], v, rx - lx); return; } int m = (lx + rx) / 2; modify(l, r, v, 2 * x + 1, lx, m); modify(l, r, v, 2 * x + 2, m, rx); tree[x] = combine(tree[2 * x + 1], tree[2 * x + 2]); } void modify(int l, int r, int v) { modify(l, r, v, 0, 0, size); } T query(int l, int r, int x, int lx, int rx) { propagate(x, lx, rx); if (lx >= r || rx <= l) return value_identity; if (l <= lx && rx <= r) { return tree[x]; } int m = (lx + rx) / 2; T a = query(l, r, 2 * x + 1, lx, m); T b = query(l, r, 2 * x + 2, m, rx); return combine(a, b); } T query(int l, int r) { return query(l, r, 0, 0, size); } T query(int i, int x, int lx, int rx) { propagate(x, lx, rx); if (rx - lx == 1) { return tree[x]; } int m = (lx + rx) / 2; if (i < m) { return query(i, 2 * x + 1, lx, m); } else { return query(i, 2 * x + 2, m, rx); } } T query(int i) { return query(i, 0, 0, size); } void build(vector<T>& v, int x, int lx, int rx) { if (rx - lx == 1) { if (lx < v.size()) { tree[x] = v[lx]; } return; } int m = (lx + rx) / 2; build(v, 2 * x + 1, lx, m); build(v, 2 * x + 2, m, rx); tree[x] = combine(tree[2 * x + 1], tree[2 * x + 2]); } void build(vector<T>& v) { build(v, 0, 0, size); } }; // O(log^2n) int lower_bnd(lazy_segtree& st, int x, int n) { int l = -1, r = n; while (r > l + 1) { int mid = (r + l) / 2; if (st.query(mid) >= x) { r = mid; } else { l = mid; } } return r; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, m; cin >> n >> m; vector<ll> v(n); for (int i = 0; i < n; ++i) { cin >> v[i]; } lazy_segtree st(n); sort(v.begin(), v.end()); st.build(v); for (int i = 0; i < m; ++i) { char q; cin >> q; if (q == 'F') { int c, h; cin >> c >> h; int first = lower_bnd(st, h, n); //DEBUG(first); if (first == n) continue; int last = min(first + c - 1, n - 1); //DEBUG(last); if (last < n - 1 && st.query(last) == st.query(last + 1)) { int last_v = st.query(last); int last_of_last = lower_bnd(st, last_v + 1, n); //DEBUG(last_of_last); int first_of_last = lower_bnd(st, last_v, n); //DEBUG(first_of_last); st.modify(first, first_of_last, 1); int x = c - abs(first_of_last - first); //DEBUG(x); st.modify(last_of_last - x, last_of_last, 1); } else { st.modify(first, last + 1, 1); } } else { int mn, mx; cin >> mn >> mx; int l = lower_bnd(st, mn, n); int r = lower_bnd(st, mx + 1, n); //DEBUG(l); // DEBUG(r); cout << r - l << '\n'; } } }

Compilation message (stderr)

grow.cpp: In member function 'void lazy_segtree::build(std::vector<long long int>&, int, int, int)':
grow.cpp:102:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  102 |             if (lx < v.size()) {
      |                 ~~~^~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...