제출 #1239343

#제출 시각아이디문제언어결과실행 시간메모리
1239343Hamed_Ghaffari사탕 분배 (IOI21_candies)C++20
100 / 100
232 ms36408 KiB
#include "candies.h" #include <bits/stdc++.h> using namespace std; using ll = long long; #define lc id<<1 #define rc lc|1 #define mid ((l+r)>>1) const int MXN = 2e5+5; int n, q; ll mx[MXN<<2], mn[MXN<<2], lz[MXN<<2]; inline void apply(ll x, int id) { mx[id] += x; mn[id] += x; lz[id] += x; } inline void push(int id) { if(lz[id]) { apply(lz[id], lc); apply(lz[id], rc); lz[id] = 0; } } void upd(int s, int e, ll x, int l=0, int r=q+1, int id=1) { if(s>=r || l>=e) return; if(s<=l && r<=e) { apply(x, id); return; } push(id); upd(s, e, x, l, mid, lc); upd(s, e, x, mid, r, rc); mx[id] = max(mx[lc], mx[rc]); mn[id] = min(mn[lc], mn[rc]); } ll cmx_, cmn_, val; int find(ll lb, ll cmx=-1e18, ll cmn=1e18, int l=0, int r=q+1, int id=1) { if(max(mx[id], cmx)-min(mn[id], cmn)<lb) return -1; if(r-l == 1) { cmx_=max(cmx, mx[id]), cmn_=min(cmn, mn[id]), val=mx[id]; return l; } push(id); int res = find(lb, cmx, cmn, mid, r, rc); return res==-1 ? find(lb, max(cmx, mx[rc]), min(cmn, mn[rc]), l, mid, lc) : res; } vector<int> S[MXN], E[MXN]; vector<int> distribute_candies(vector<int> c, vector<int> lq, vector<int> rq, vector<int> vq) { n = c.size(), q = lq.size(); for(int i=0; i<q; i++) { S[lq[i]].push_back(i); E[rq[i]+1].push_back(i); } ll tot = 0; vector<int> ans(n); for(int i=0; i<n; i++) { for(int j : S[i]) tot += vq[j], upd(j+1, q+1, vq[j]); for(int j : E[i]) tot -= vq[j], upd(j+1, q+1, -vq[j]); int wh = find(c[i]); if(wh==-1) ans[i] = tot-mn[1]; else ans[i] = val==cmx_ ? tot-cmn_ : tot-cmx_+c[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...