Submission #916181

#TimeUsernameProblemLanguageResultExecution timeMemory
916181JakobZorzDancing Elephants (IOI11_elephants)C++17
26 / 100
9098 ms11752 KiB
#include"elephants.h" #include<iostream> #include<vector> #include<algorithm> using namespace std; const int BUCKET_SIZE=256; int n,l; int pos[150000]; struct Bucket{ vector<int>arr; vector<int>num; vector<int>pos; void regen(){ num.resize(arr.size()); pos.resize(arr.size()); for(int i=0;i<(int)arr.size();i++){ num[i]=0; pos[i]=-1; for(int j=i;j<(int)arr.size();j++){ if(arr[j]>pos[i]){ num[i]++; pos[i]=arr[j]+l; } } } } void erase(int el){ auto it=lower_bound(arr.begin(),arr.end(),el); arr.erase(it); regen(); } void add(int el){ auto it=upper_bound(arr.begin(),arr.end(),el); arr.insert(it,el); regen(); } pair<int,int>get(int p){ if(arr.empty()||p>=arr.back()) return{0,p}; int l=-1,r=(int)arr.size()-1; while(l<r-1){ int m=(l+r)/2; if(arr[m]<=p) l=m; else r=m; } return{num[r],pos[r]}; } }; vector<Bucket*>buckets; void init(int N,int L,int X[]){ n=N; l=L; vector<int>vec; for(int i=0;i<n;i++){ pos[i]=X[i]; vec.push_back(X[i]); } sort(vec.begin(),vec.end()); buckets.push_back(new Bucket); for(int i:vec){ buckets.back()->arr.push_back(i); if((int)buckets.back()->arr.size()==BUCKET_SIZE){ buckets.push_back(new Bucket); } } for(auto i:buckets) i->regen(); } int update(int i,int y){ for(auto b:buckets){ if(b->arr[0]<=pos[i]&&pos[i]<=b->arr.back()){ b->erase(pos[i]); break; } } pos[i]=y; int cb=0; while(cb<(int)buckets.size()){ if(!buckets[cb]->arr.empty()&&buckets[cb]->arr[0]>=y) break; cb++; } if(cb) cb--; buckets[cb]->add(y); int pos=-1,res=0; for(auto b:buckets){ auto r=b->get(pos); res+=r.first; pos=r.second; } return res; }
#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...