Submission #1309921

#TimeUsernameProblemLanguageResultExecution timeMemory
1309921michael12Distributing Candies (IOI21_candies)C++20
0 / 100
224 ms20768 KiB
#include "candies.h" #include <bits/stdc++.h> using namespace std; struct segtree { struct Node { int val = 0; int mn = 0; int mx = 0; int lazy = 0; }; vector<Node> tree; int n; vector<int> limit; segtree(int n, const vector<int>& c) : n(n), limit(c) { tree.resize(4 * n); } void push(int node, int start, int end) { if(tree[node].lazy != 0) { tree[node].val += tree[node].lazy; tree[node].mn += tree[node].lazy; tree[node].mx += tree[node].lazy; if(start != end) { tree[2*node].lazy += tree[node].lazy; tree[2*node+1].lazy += tree[node].lazy; } tree[node].lazy = 0; } if(start == end) { tree[node].val = max(0, min(tree[node].val, limit[start])); tree[node].mn = tree[node].val; tree[node].mx = tree[node].val; } else { tree[node].mn = min(tree[2*node].mn, tree[2*node+1].mn); tree[node].mx = max(tree[2*node].mx, tree[2*node+1].mx); } } void update(int node, int start, int end, int l, int r, int val) { push(node, start, end); if(start > r || end < l) return; if(l <= start && end <= r) { tree[node].lazy += val; push(node, start, end); if(tree[node].mn < 0 || tree[node].mx > limit[start]) { if(start != end) { push(2*node, start, (start+end) / 2); push(2*node+1, (start+end) / 2 + 1, end); } } return; } int mid = (start + end) / 2; update(2*node, start, mid, l, r, val); update(2*node+1, mid+1, end, l, r, val); tree[node].mn = min(tree[2*node].mn, tree[2*node+1].mn); tree[node].mx = max(tree[2*node].mx, tree[2*node+1].mx); } int get(int node, int start, int end, int id) { push(node, start, end); if(start == end) return tree[node].val; int mid = (start + end) / 2; if(id <= mid) return get(2*node, start, mid, id); else return get(2*node+1, mid+1, end, id); } }; vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v){ int sz = c.size(); segtree ST(sz, c); for(int i = 0; i < v.size(); i++){ ST.update(1, 0, sz-1, l[i], r[i], v[i]); } vector<int> ans(sz); for(int i = 0; i < sz; i++){ ans[i] = ST.get(1, 0, sz-1, i); } return ans; }
#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...