Submission #1208200

#TimeUsernameProblemLanguageResultExecution timeMemory
1208200tkm_algorithmsDistributing Candies (IOI21_candies)C++20
0 / 100
698 ms39496 KiB
/** * In the name of Allah * We are nothing and you're everything **/ #include <bits/stdc++.h> #include "candies.h" using namespace std; using ll = long long; using ull = int64_t; #define all(x) begin(x), end(x) #define sz(x) (ll)(x).size() //#define ll long long const char nl = '\n'; const ll N = 2e5+1; const ll inf = 0x3f3f3f3f3f3f3f3fll; const ll mod = 1e9+7; struct node { ll mx, mn, mni, mxi, lz; node () { mx = -inf, mn = inf, mni = 0, mxi = 0, lz = 0; } }; struct segtree { vector<node> tree; int size; void init(int n) { size = 1; while (size < n)size<<=1; tree.assign(2*size-1, node()); } void build(int x, int lx, int rx) { tree[x].mx = tree[x].mn = 0; tree[x].mni = tree[x].mxi = lx; tree[x].lz = 0; if (rx-lx==1)return; int mid = lx+rx>>1; build(2*x+1, lx, mid); build(2*x+2, mid, rx); } void build(int n) { init(n); build(0, 0, size); } void addval(int x, int v) { tree[x].mn += v, tree[x].mx += v; tree[x].lz += v; } void push(int x) { tree[2*x+1].mn += tree[x].lz; tree[2*x+2].mx += tree[x].lz; tree[2*x+1].lz += tree[x].lz; tree[2*x+2].lz += tree[x].lz; tree[x].lz = 0; } node comb(node a, node b) { node c; if (a.mx > b.mx)c.mx = a.mx, c.mxi = a.mxi; else c.mx = b.mx, c.mxi = b.mxi; if (a.mn < b.mn)c.mn = a.mn, c.mni = a.mni; else c.mn = b.mn, c.mni = b.mni; return c; } void add(int l, int r, int v, int x, int lx, int rx) { if (rx <= l || r <= lx)return; if (lx >= l && rx <= r) { addval(x, v); return; } push(x); int mid = lx+rx>>1; add(l, r, v, 2*x+1, lx, mid); add(l, r, v, 2*x+2, mid, rx); tree[x] = comb(tree[2*x+1], tree[2*x+2]); } void add(int l, int r, int v) { add(l, r, v, 0, 0, size); } node get(int l, int r, int x, int lx, int rx) { if (rx <= l || r <= lx)return node(); if (lx >= l && rx <= r)return tree[x]; int mid = lx+rx>>1; return comb(get(l, r, 2*x+1, lx, mid), get(l, r, 2*x+2, mid, rx)); } node get(int l, int r) { return get(l, r, 0, 0, size); } }; vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) { segtree st; st.build(sz(l)+1); int n = sz(c), q = sz(l); vector<pair<int, int>> g[n+1]; for (int i = 0; i < q; ++i) { g[l[i]].push_back(make_pair(i, v[i])); if (r[i] < n-1)g[r[i]+1].push_back(make_pair(i, -v[i])); } vector<int> res(n); int sum = 0; for (int i = 0; i < n; ++i) { for (auto j: g[i]) { st.add(j.first, q, j.second); sum += j.second; } ll id = -1, wall = -1, tp = 0; int lx = 0, rx = q-1; while (lx <= rx) { int mid = lx+rx>>1; node gt = st.get(mid, q); if (gt.mx-gt.mn >= c[i]) { lx = mid+1; if (gt.mni < gt.mxi)id = gt.mni, wall = gt.mn; else id = gt.mxi, wall = gt.mx, tp = 1; } else rx = mid-1; } //cout << sum << nl; if (id == -1) { node gt = st.get(0, q); cout << gt.mn << " " << gt.mx << nl; if (gt.mn < 0)wall = gt.mn; if (gt.mx > 0 && gt.mx >= c[i])wall = gt.mx-c[i]; res[i] = sum-wall; continue; } res[i] = (tp==0?sum-wall:sum-wall+c[i]); } return res; } void solve() { int n, q; cin >> n >> q; vector<int> c(n), l(q), r(q), v(q); for (auto &i : c) cin >> i; for (auto &i : l) cin >> i; for (auto &i : r) cin >> i; for (auto &i : v) cin >> i; vector<int> result = distribute_candies(c, l, r, v); for (const auto &i : result) cout << i << " "; //int n; //cin >> n; //segtree T(n); //while (1) { //string op; //int l, r, v; //cin >> op; //if (op == "add") { //cin >> l >> v; //T.add(l, v); //} //else if (op == "minimix") { //cin >> l >> r; //info res = T.minimix(l, r); //printf("(%lld, %d), (%lld, %d)\n", res.mn, res.imn, res.mx, res.imx); //} //else if (op == "suffix") { //cin >> v; //info res = T.suffix(v); //printf("(%lld, %d), (%lld, %d)\n", res.mn, res.imn, res.mx, res.imx); //} //} } //int main() { //ios::sync_with_stdio(0), cin.tie(0); //solve(); //}
#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...