제출 #1290336

#제출 시각아이디문제언어결과실행 시간메모리
1290336MMihalev사탕 분배 (IOI21_candies)C++20
0 / 100
5093 ms30052 KiB
#include<iostream> #include<vector> #include<algorithm> #include<set> #include "candies.h" using namespace std; const int MAX_N=2e5+5; const int BUFF=500; vector<int>cap; vector<long long>a,nxt; vector<pair<int,long long>>queries; set<pair<int,long long>>curqueries; void solve(int l,int r) { queries.clear(); for(auto x:curqueries)queries.push_back(x); vector<long long>p,nxt; p.resize((int)queries.size()); nxt.resize((int)queries.size()); p[0]=queries[0].second; for(int i=1;i<queries.size();i++) { p[i]=p[i-1]+queries[i].second; } nxt[queries.size()-1]=queries.size()-1; for(int i=queries.size()-2;i>=0;i--) { nxt[i]=queries.size()-1; for(int j=i+1;j<queries.size();j++) { if(p[j]<p[i]){nxt[i]=j;break;} } } vector<pair<long long,int>>nums; for(int i=l;i<=r;i++) { nums.push_back({a[i],i}); } sort(nums.begin(),nums.end()); int id=0; for(auto [num,i]:nums) { while(p[id]+a[i]>0 && id<p.size())id++; if(id==p.size()) { a[i]-=p.back(); } else { a[i]=min((long long)cap[i],p.back()-p[id]); } } } vector<pair<pair<int,int>,pair<int,int>>>buffer; vector<pair<int,int>>beg[MAX_N],en[MAX_N]; int N; void clearbuffer() { for(int i=0;i<=N;i++) { beg[i].clear();en[i].clear(); } for(auto [f,s]:buffer) { int l,r,i,val; l=f.first;r=f.second;i=s.first;val=s.second; beg[l].push_back({i,val}); en[r+1].push_back({i,val}); } curqueries.clear(); int prevpoint=-1; for(int i=0;i<=N;i++) { if(en[i].size() && prevpoint!=-1) { solve(prevpoint,i-1); } for(auto x:en[i]) { curqueries.erase(x); } if(en[i].size() && curqueries.size())prevpoint=i-1; if(curqueries.size()==0)prevpoint=-1; if(beg[i].size() && prevpoint!=-1) { solve(prevpoint,i-1); } for(auto x:beg[i]) { curqueries.insert(x); } if(beg[i].size())prevpoint=i; } } std::vector<int> distribute_candies(std::vector<int> c, std::vector<int> l,std::vector<int> r, std::vector<int> v) { cap=c; N=cap.size(); a.resize((int)cap.size()); for(int i=0;i<l.size();i++) { buffer.push_back({{l[i],r[i]},{i,v[i]}}); if(buffer.size()==BUFF) { clearbuffer(); } } if(buffer.size()) { clearbuffer(); } vector<int>aa; for(int x:a) { aa.push_back(x); } return aa; }
#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...