(UPD: 2024-12-04 14:48 UTC) Judge is not working due to Cloudflare incident. (URL) We can do nothing about it, sorry. After the incident is resolved, we will grade all submissions.

Submission #601392

#TimeUsernameProblemLanguageResultExecution timeMemory
6013921neDistributing Candies (IOI21_candies)C++17
100 / 100
1351 ms41736 KiB
#include "candies.h" #include <bits/stdc++.h> using namespace std; struct dataa{ long long Min = 0,Max = 0,v = 0,lazy = 0; void add(long long left,long long right,long long val){ v += val; lazy += val; Min +=val; Max +=val; } }; struct Segment_Tree{ vector<dataa>tree; void init(long long n){ tree.resize(2*n - 1); } dataa combine(dataa left,dataa right){ dataa res; res.Min = min(left.Min,right.Min); res.v = left.v + right.v; res.Max = max(left.Max,right.Max); return res; } void push(long long node,long long left,long long right){ long long mid = (left + right)>>1; long long z = node + ((mid - left + 1)<<1); if (tree[node].lazy!=0){ tree[node + 1].add(left,mid,tree[node].lazy); tree[z].add(mid + 1,right,tree[node].lazy); tree[node].lazy = 0; } } dataa query(long long node,long long left,long long right,long long qleft,long long qright){ if (qright<left|| qleft > right)return {LLONG_MAX,LLONG_MIN,0}; if (qleft<=left && qright>=right){ return tree[node]; } push(node,left,right); long long mid = (left + right)>>1; long long z = node + ((mid - left + 1)<<1); return combine(query(node + 1,left,mid,qleft,qright),query(z,mid + 1,right,qleft,qright)); } void update(long long node,long long left,long long right,long long uleft,long long uright,long long v){ if (left > uright || right < uleft) return; if (uleft <= left && right <=uright){ tree[node].add(left,right,v); return; } push(node,left,right); long long mid = (left + right)>>1; long long z = node + ((mid - left + 1)<<1); if (uleft<=mid){ update(node + 1,left,mid,uleft,uright,v); } if (uright > mid){ update(z,mid + 1,right,uleft,uright,v); } tree[node] = combine(tree[node + 1],tree[z]); } }; std::vector<int> distribute_candies(std::vector<int> c, std::vector<int> l, std::vector<int> r, std::vector<int> v) { int n = (int)c.size(); vector<int>ans(n); int m = (int)l.size(); vector<vector<pair<long long,long long>>>segment(n + 1); for (int i = 0;i<m;++i){ segment[l[i]].push_back({v[i],i}); segment[r[i] + 1].push_back({-v[i],i}); } Segment_Tree st; st.init(m + 1); for (int i = 0;i<n;++i){ for (auto x:segment[i]){ st.update(0,0,m,x.second + 1,m,x.first); } int left = 0,right = m; int p = -1; dataa pos; while(left<=right){ int mid = (left + right)>>1; auto temp = st.query(0,0,m,mid,m); if (temp.Max - temp.Min >= c[i]){ left = mid + 1; p = mid; pos = temp; } else right = mid - 1; } long long sum = st.query(0,0,m,m,m).v; // cout<<sum<<" "<<pos.Min<<" "<<pos.Max<<" "<<pos.v<<'\n'; if (p == -1){ ans[i] = sum - st.query(0,0,m,0,m).Min; } else if (pos.Min == st.query(0,0,m,p,p).v){ ans[i] = max(0LL,sum - pos.Max + c[i]); } else{ ans[i] = max(0LL,sum - pos.Min); } } 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...