제출 #916345

#제출 시각아이디문제언어결과실행 시간메모리
916345JakobZorz코끼리 (Dancing Elephants) (IOI11_elephants)C++17
100 / 100
5653 ms21496 KiB
#include"elephants.h" #include<iostream> #include<vector> #include<algorithm> using namespace std; const int BUCKET_SIZE=256; int 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=(int)arr.size()-1;i>=0;i--){ num[i]=1; int p=arr[i]+l; if(p>=arr.back()){ pos[i]=p; continue; } int l=-1,r=(int)arr.size(); while(l<r-1){ int m=(l+r)/2; if(arr[m]<=p) l=m; else r=m; } num[i]+=num[r]; pos[i]=pos[r]; } } 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(); 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[]){ int n=N; l=L; vector<int>vec; for(int i=0;i<n;i++){ pos[i]=X[i]; vec.push_back(pos[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){ // balance buckets for(int i=0;i<(int)buckets.size();i++){ if(buckets[i]->arr.size()>=2*BUCKET_SIZE){ buckets.insert(buckets.begin()+i+1,new Bucket); buckets[i+1]->arr=vector<int>(buckets[i]->arr.begin()+buckets[i]->arr.size()/2,buckets[i]->arr.end()); buckets[i]->arr.erase(buckets[i]->arr.begin()+buckets[i]->arr.size()/2,buckets[i]->arr.end()); buckets[i]->regen(); buckets[i+1]->regen(); } } for(auto b:buckets){ if(b->arr.size()&&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.size()&&buckets[cb]->arr[0]>y) break; cb++; } if(cb) cb--; while(cb&&buckets[cb]->arr.empty()) 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; } /*if(res==137){ cout<<"special case\n"; int c=-1; for(auto b:buckets){ for(int a:b->arr){ if(c>a){ cout<<"ERROR "<<c<<" "<<a<<"\n"; } c=a; } } }*/ 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...