제출 #1216877

#제출 시각아이디문제언어결과실행 시간메모리
1216877thelegendary08사탕 분배 (IOI21_candies)C++17
0 / 100
311 ms46652 KiB
#include "candies.h" #include<bits/stdc++.h> #define int long long #define vi vector<long long> #define f0r(i,n) for(int i = 0; i<n; i++) #define mp make_pair #define pb push_back #define FOR(i, k, n) for(int i = k; i<n; i++) #define pii pair<int,int> #define dout(x) cout<<x<<' '<<#x<<'\n'; #define vout(x) for(auto u : x)cout<<u<<' '; cout<<'\n'; #define vvi vector<vi> #define vb vector<bool> using namespace std; int cap; struct segtree{ int n; vi mn, mx; vi tl; vi tr; vi la; vi ls; vi dx; segtree(int x){ n = x; int mxn = 4 * n + 5; mn.resize(mxn); mx.resize(mxn); tl.resize(mxn); tr.resize(mxn); la.resize(mxn); ls.resize(mxn); dx.resize(n); build(1, 0, n-1); } void pull(int v){ mn[v] = min(mn[v * 2], mn[v * 2 + 1]); mx[v] = max(mx[v * 2], mx[v * 2 + 1]); } void build(int v, int l, int r){ tl[v] = l; tr[v] = r; if(l == r){ return; } int mid = (l + r) / 2; build(v * 2, l, mid); build(v * 2 + 1, mid + 1, r); pull(v); } int sz(int v){ return tr[v] - tl[v] + 1; } void add(int v, int x){ la[v] += x; mn[v] += x; mx[v] += x; } void sett(int v, int x){ ls[v] = x; la[v] = 0; mn[v] = x; mx[v] = x; } void push(int v){ if(ls[v]){ sett(v*2,ls[v]); sett(v*2+1,ls[v]); ls[v] = 0; } if(la[v]){ add(v*2, la[v]); add(v * 2 +1, la[v]); la[v] = 0; } } void upd(int v, int l, int r, int x){ // cout<<tl[v]<<' '<<tr[v]<<' '<<x<<'\n'; if(tl[v] > r || tr[v] < l)return; if(tl[v] >= l && tr[v] <= r){ if(x > 0){ if(mx[v] + x <= cap){ // cout<<tl[v]<<' '<<tr[v]<<' '<<x<<'\n'; add(v, x); return; } if(mn[v] + x >= cap){ sett(v, cap); return; } } else{ if(mn[v] + x >= 0){ add(v, x); return; } if(mx[v] + x <= 0){ sett(v, 0); return; } } } push(v); upd(v * 2, l, r, x); upd(v * 2 + 1, l, r, x); pull(v); } int quer(int v, int x){ if(tl[v] == tr[v])return mn[v]; int tm = (tl[v] + tr[v]) / 2; push(v); int ret; if(x <= tm){ ret = quer(v * 2, x); } else ret = quer(v * 2 + 1, x); // pull(v); return ret; } }; std::vector<signed> distribute_candies(std::vector<signed> c, std::vector<signed> l, std::vector<signed> r, std::vector<signed> v) { int n = c.size(); cap = c[0]; vector<signed> ans(n); int q = l.size(); segtree s = segtree(n); f0r(i, q){ s.upd(1, l[i], r[i], v[i]); } f0r(i,n){ ans[i] = s.quer(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...