Submission #436968

#TimeUsernameProblemLanguageResultExecution timeMemory
436968haojiandanDistributing Candies (IOI21_candies)C++17
100 / 100
1258 ms32316 KiB
#include "candies.h" #include <bits/stdc++.h> using namespace std; #define MP make_pair typedef long long ll; const ll INF=1e18; const int maxn=(2e5)+10; int n,q,c[maxn]; vector<pair<int,int> > Q[maxn]; ll mn[maxn*4],mx[maxn*4],lazy[maxn*4]; void puttag(int root,ll delta) { lazy[root]+=delta,mn[root]+=delta,mx[root]+=delta; } void pushdown(int root) { if (lazy[root]) { puttag(root<<1,lazy[root]),puttag(root<<1|1,lazy[root]); lazy[root]=0; } } void update(int L,int R,int l,int r,int root,ll delta) { if (L<=l&&r<=R) { puttag(root,delta); return; } int mid=(l+r)>>1; pushdown(root); if (L<=mid) update(L,R,l,mid,root<<1,delta); if (mid<R) update(L,R,mid+1,r,root<<1|1,delta); mn[root]=min(mn[root<<1],mn[root<<1|1]); mx[root]=max(mx[root<<1],mx[root<<1|1]); } pair<ll,ll> operator + (pair<ll,ll> t1,pair<ll,ll> t2) { return MP(min(t1.first,t2.first),max(t1.second,t2.second)); } pair<ll,ll> query(int L,int R,int l,int r,int root) { if (L<=l&&r<=R) return MP(mn[root],mx[root]); int mid=(l+r)>>1; pushdown(root); pair<ll,ll> res=MP(INF,-INF); if (L<=mid) res=res+query(L,R,l,mid,root<<1); if (mid<R) res=res+query(L,R,mid+1,r,root<<1|1); return res; } vector<int> distribute_candies(vector<int> C, vector<int> l,vector<int> r, vector<int> v) { n=(int)C.size(); q=(int)v.size(); for (int i=0;i<q;i++) l[i]++,r[i]++,Q[l[i]].push_back(MP(i+1,v[i])),Q[r[i]+1].push_back(MP(i+1,-v[i])); for (int i=1;i<=n;i++) c[i]=C[i-1]; vector<int> ans(n); ll s=0; for (int i=1;i<=n;i++) { for (pair<int,int> A : Q[i]) update(A.first,q,1,q,1,A.second),s+=A.second; int l=1,r=q,mid; while (l<r) { mid=(l+r+1)>>1; pair<ll,ll> tmp=query(mid,q,1,q,1); if (tmp.second-tmp.first>=c[i]) l=mid; else r=mid-1; } pair<ll,ll> tmp=query(l,q,1,q,1); if (tmp.second-tmp.first>=c[i]) { pair<ll,ll> t2=query(l,l,1,q,1); if (tmp.first==t2.first) ans[i-1]=s-tmp.second+c[i]; else ans[i-1]=s-tmp.first; } else if (tmp.second>=c[i]) ans[i-1]=s-tmp.second+c[i]; else if (tmp.first<0) ans[i-1]=s-tmp.first; else ans[i-1]=s; } 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...