Submission #722775

#TimeUsernameProblemLanguageResultExecution timeMemory
722775Mr_HusanboyDistributing Candies (IOI21_candies)C++17
100 / 100
1243 ms41968 KiB
#include "candies.h" #include <bits/stdc++.h> using namespace std; using ll = long long; template<typename T> int len(T &a){ return a.size(); } const ll infl = 1e8; struct Segtree{ struct node{ ll mx = 0, mn = 0, add = 0; void apply(ll x){ mn += x; mx += x; add += x; } }; vector<node> t; int n; Segtree(int _n){ n = _n; t.resize(4 * n); } void push(int x){ if(t[x].add){ t[x << 1].apply(t[x].add); t[x << 1 | 1].apply(t[x].add); t[x].add = 0; } } node merge(node a, node b){ return {max(a.mx, b.mx), min(a.mn, b.mn), 0ll}; } void upd(int x, int lx, int rx, int l, int r, ll val){ if(l <= lx && rx <= r){ t[x].apply(val); return; } if(r < lx || l > rx){ return; } int m = (rx + lx) >> 1; push(x); upd(x << 1, lx, m, l, r, val); upd(x << 1 | 1, m + 1, rx, l, r, val); t[x] = merge(t[x << 1], t[x << 1 | 1]); } node get(int x, int lx, int rx, int l, int r){ if(l <= lx && rx <= r){ return t[x]; } if(r < lx || l > rx){ return {0,0,0}; } push(x); int m = (lx + rx) >> 1; return merge(get(x << 1, lx, m, l, r), get(x << 1 | 1, m + 1, rx, l, r)); } void upd(int l, int r, ll val){ upd(1, 0, n - 1, l, r, val); } node get(int l, int r){ return get(1, 0, n - 1, l, r); } }; vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) { int n = c.size(); int m = len(v); Segtree t(m + 1); vector<vector<int>> in(n), out(n); for(int i = 0; i < m; i ++){ in[l[i]].push_back(i); out[r[i]].push_back(i); } for(int i = 0; i < n; i ++){ for(auto u : in[i]){ t.upd(0, u, -v[u]); } int l = 0, r = m; while(l <= r){ int mid = (l + r) >> 1; auto res = t.get(mid, m); if(res.mx - res.mn > c[i]){ l = mid + 1; }else r = mid - 1; } r ++; if(r == 0 || v[r - 1] < 0){ c[i] = -t.get(r, m).mn; }else{ c[i] = c[i] - t.get(r, m).mx; } for(auto u : out[i]){ t.upd(0, u, v[u]); } } //for(auto u : suf) cout << u << ' ';cout << endl; return c; }
#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...