제출 #456442

#제출 시각아이디문제언어결과실행 시간메모리
456442benedict0724사탕 분배 (IOI21_candies)C++17
100 / 100
603 ms43880 KiB
#include "candies.h" #include <vector> using namespace std; typedef long long ll; const ll INF = 1e16; vector<pair<ll, ll>> tree; vector<ll> lazy; vector<int> query[200002]; vector<int> ans; void propagate(int i, int l, int r) { tree[i].first += lazy[i]; tree[i].second += lazy[i]; if(l != r) { lazy[i*2] += lazy[i]; lazy[i*2+1] += lazy[i]; } lazy[i] = 0; } void update(int i, int l, int r, int s, int e, ll v) { propagate(i, l, r); if(e < l || r < s) return; if(s <= l && r <= e) { lazy[i] += v; propagate(i, l, r); return; } int m = (l + r)/2; update(i*2, l, m, s, e, v); update(i*2+1, m+1, r, s, e, v); tree[i].first = max(tree[i*2].first, tree[i*2+1].first); tree[i].second = min(tree[i*2].second, tree[i*2+1].second); } ll sum = 0; void solve(int i, int l, int r, ll C, int k, ll Ma, ll mi) { propagate(i, l, r); if(l == r) { if(max(tree[i].first,Ma) - min(tree[i].first,mi) <= C) ans[k] = sum - min(tree[i].first, mi); else if(tree[i].first > Ma) ans[k] = sum - mi; else ans[k] = C - Ma + sum; return; } int m = (l + r)/2; propagate(i*2+1, m+1, r); if(max(tree[i*2+1].first, Ma) - min(tree[i*2+1].second, mi) <= C) { Ma = max(tree[i*2+1].first, Ma), mi = min(tree[i*2+1].second, mi); solve(i*2, l, m, C, k, Ma, mi); } else solve(i*2+1, m+1, r, C, k, Ma, mi); } std::vector<int> distribute_candies(std::vector<int> c, std::vector<int> l, std::vector<int> r, std::vector<int> v) { int n = c.size(); int q = l.size(); tree.resize(4*q+4); lazy.resize(4*q+4); ans.resize(n); for(int i=1;i<=q;i++) { query[l[i-1]].push_back(i); query[r[i-1]+1].push_back(-i); } for(int i=0;i<n;i++) { for(int j : query[i]) { if(j > 0) { update(1, 0, q, j, q, v[j-1]); sum += v[j-1]; } else { update(1, 0, q, -j, q, -v[-j-1]); sum -= v[-j-1]; } } solve(1, 0, q, c[i], i, -INF, INF); } 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...