Submission #997657

#TimeUsernameProblemLanguageResultExecution timeMemory
997657bachhoangxuanComparing Plants (IOI20_plants)C++17
44 / 100
212 ms22532 KiB
#include "plants.h" #include<bits/stdc++.h> using namespace std; const int maxn = 2e5+5; const int inf = 1e9; int n,k; vector<int> P,R; set<int> ss,cc; void cal(int x,int y){ cc.erase(y); if((y-x+n)%n>=k){ //cout << "add " << y << '\n'; cc.insert(y); } } void add(int x){ if(ss.empty()){ ss.insert(x); cc.insert(x); //cout << "add " << x << '\n'; return; } auto it=ss.lower_bound(x); if(it!=ss.end()) cal(x,*it); else cal(x,*ss.begin()); if(it==ss.begin()) cal(*ss.rbegin(),x); else{ it--; cal(*it,x); } ss.insert(x); } void del(int x){ cc.erase(x);ss.erase(x); if(ss.empty()) return; auto it=ss.lower_bound(x); int y=(it!=ss.end()?*it:*ss.begin()); cc.insert(y); } int tree[4*maxn],lazy[4*maxn]; void build(int l,int r,int id){ if(l==r){ tree[id]=R[l]; return; } int mid=(l+r)>>1; build(l,mid,id<<1);build(mid+1,r,id<<1|1); tree[id]=min(tree[id<<1],tree[id<<1|1]); } void getnew(int id,int val){ tree[id]-=val; lazy[id]+=val; } void pushdown(int id){ if(!lazy[id]) return; getnew(id<<1,lazy[id]); getnew(id<<1|1,lazy[id]); lazy[id]=0; } void get(int l,int r,int id){ if(tree[id]>0) return; if(l==r){ tree[id]=inf; //cout << "add2 " << l << '\n'; add(l); return; } pushdown(id); int mid=(l+r)>>1; get(l,mid,id<<1);get(mid+1,r,id<<1|1); tree[id]=min(tree[id<<1],tree[id<<1|1]); } void update(int l,int r,int id,int tl,int tr){ if(tr<l || r<tl) return; if(tl<=l && r<=tr){ getnew(id,1); return; } pushdown(id); int mid=(l+r)>>1; update(l,mid,id<<1,tl,tr);update(mid+1,r,id<<1|1,tl,tr); tree[id]=min(tree[id<<1],tree[id<<1|1]); } void init(int _k, std::vector<int> r) { k=_k;R=r; n=(int)r.size(); P.assign(n,0); build(0,n-1,1); for(int i=n-1;i>=0;i--){ get(0,n-1,1); int x=*cc.begin();P[x]=i;del(x); //cout << "P " << x << ' ' << i << '\n'; if(x>=k-1) update(0,n-1,1,x-k+1,x); else{ update(0,n-1,1,0,x); update(0,n-1,1,n-(k-x)+1,n-1); } } //for(int i=0;i<n;i++) cout << P[i] << ' '; //cout << '\n'; } int compare_plants(int x, int y) { return (P[x]>P[y]?1:-1); }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...