Submission #1207690

#TimeUsernameProblemLanguageResultExecution timeMemory
1207690tkm_algorithmsDistributing Candies (IOI21_candies)C++20
27 / 100
431 ms15744 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 = uint64_t; #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() //#define int long long const char nl = '\n'; const int N = 2e5+1; const ll inf = 0x3f3f3f3f3f3f3f3fll; const int mod = 1e9+7; int C; struct node { int set, mn, mx, lz; node() { set = -1, mn = 0, mx = 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 apply(int x, int v) { tree[x].mn = tree[x].mx = tree[x].set = v; tree[x].lz = 0; } void add(int x, int v) { tree[x].mn += v; tree[x].mx += v; tree[x].lz += v; } void push(int x, int y) { if (tree[x].set != -1) { apply(y, tree[x].set); tree[x].set = -1, tree[y].lz = 0; } if (tree[x].lz != 0) { add(y, tree[x].lz); tree[x].lz = 0; } } void radd(int l, int r, int v, int x, int lx, int rx) { if (rx <= l || r <= lx)return; if (lx >= l && rx <= r) { add(x, v); //cout << tree[x].mn << " " << tree[x].mx << " " << tree[x].set << " " << tree[x].lz << nl; return; } node a = tree[x]; push(x, 2*x+1); tree[x] = a; push(x, 2*x+2); int mid = lx+rx>>1; radd(l, r, v, 2*x+1, lx, mid); radd(l, r, v, 2*x+2, mid, rx); tree[x].mn = min(tree[2*x+1].mn, tree[2*x+2].mn); tree[x].mx = max(tree[2*x+1].mx, tree[2*x+2].mx); } void radd(int l, int r, int v) { radd(l, r, v, 0, 0, size); } void minimize(int l, int r, int x, int lx, int rx) { if (rx <= l || r <= lx || tree[x].mx <= C)return; if (lx >= l && rx <= r) if (tree[x].mn > C) { apply(x, C); return; } node a = tree[x]; push(x, 2*x+1); tree[x] = a; push(x, 2*x+2); int mid = lx+rx>>1; minimize(l, r, 2*x+1, lx, mid); minimize(l, r, 2*x+2, mid, rx); tree[x].mn = min(tree[2*x+1].mn, tree[2*x+2].mn); tree[x].mx = max(tree[2*x+1].mx, tree[2*x+2].mx); } void minimize(int l, int r) { minimize(l, r, 0, 0, size); } void maximize(int l, int r, int x, int lx, int rx) { if (rx <= l || r <= lx || tree[x].mn >= 0)return; if (lx >= l && rx <= r) if (tree[x].mx < 0) { apply(x, 0); return; } node a = tree[x]; push(x, 2*x+1); tree[x] = a; push(x, 2*x+2); int mid = lx+rx>>1; maximize(l, r, 2*x+1, lx, mid); maximize(l, r, 2*x+2, mid, rx); tree[x].mn = min(tree[2*x+1].mn, tree[2*x+2].mn); tree[x].mx = max(tree[2*x+1].mx, tree[2*x+2].mx); } void maximize(int l, int r) { maximize(l, r, 0, 0, size); } int get(int i, int x, int lx, int rx) { if (rx-lx==1) { //cout << tree[x].mn << nl; assert(tree[x].mn == tree[x].mx); return tree[x].mn; } int mid = lx+rx>>1; node a = tree[x]; push(x, 2*x+1); tree[x] = a; push(x, 2*x+2); if (i < mid)return get(i, 2*x+1, lx, mid); else return get(i, 2*x+2, mid, rx); tree[x].mn = min(tree[2*x+1].mn, tree[2*x+2].mn); tree[x].mx = max(tree[2*x+1].mx, tree[2*x+2].mx); } int get(int i) { return get(i, 0, 0, size); } }; vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) { int n = sz(c), q = sz(l); C = c[0]; segtree st; st.init(n+1); for (int i = 0; i < q; ++i) { st.radd(l[i], r[i]+1, v[i]); if (v[i] > 0)st.minimize(l[i], r[i]+1); if (v[i] < 0)st.maximize(l[i], r[i]+1); } vector<int> res(n); for (int i = 0; i < n; ++i)res[i] = st.get(i); return res; } //int main() { //vector<int> ans = distribute_candies({15, 15, 15}, {0, 0}, {1, 2}, {10, 100}); //for (auto &i: ans)cout << i << " "; //return 0; //}
#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...