#include "plants.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vii;
typedef pair<int,int> pi;
typedef vector<pi> pii;
typedef tuple<int,int,int> ti;
typedef vector<ll> li;
typedef vector<li> lii;
#define REP(i,a,b) for(int i=a;i<b;i++)
#define F first
#define S second
#define PB push_back
#define LSOne(s) ((s)&(-s))
#define all(x) (x).begin(),(x).end()
ll INF=9000000000000000010;
int inf=1e9+10;
ll M=1e9+7;
int n,k;
vi a,st,R,lazy,ind;
void build(int x,int l,int r){
if(l==r){
st[x]=R[l];
ind[x]=l;
return;
}
int m=(l+r)/2;
build(2*x,l,m);
build(2*x+1,m+1,r);
st[x]=min(st[2*x],st[2*x+1]);
ind[x]=(st[x]==st[2*x]?ind[2*x]:ind[2*x+1]);
}
void push(int x){
st[2*x]+=lazy[x];
st[2*x+1]+=lazy[x];
lazy[2*x]+=lazy[x];
lazy[2*x+1]+=lazy[x];
lazy[x]=0;
}
void update(int x,int l,int r,int u,int v,int val){
if(u>v)return;
if(u<0)exit(0);
if(l!=r&&lazy[x])push(x);
if(l==u&&r==v){
st[x]+=val;
lazy[x]=val;
return;
}
int m=(l+r)/2;
update(2*x,l,m,u,min(v,m),val);
update(2*x+1,m+1,r,max(u,m+1),v,val);
st[x]=min(st[2*x],st[2*x+1]);
ind[x]=(st[x]==st[2*x]?ind[2*x]:ind[2*x+1]);
}
void init(int K, std::vector<int> r) {
n=r.size();
k=K;
vi b;
R=r;
st.resize(4*n+1);
ind.resize(4*n+1);
lazy.resize(4*n+1,0);
build(1,0,n-1);
set<int> X;
set<pi> Y;
while(b.size()<n){
while(st[1]==0){
X.insert(ind[1]);
auto it=X.find(ind[1]);
auto nx=it;
auto pr=it;
if(nx!=X.end())nx++;
if(pr!=X.begin())pr--;
if(it!=X.begin()||nx!=X.end())Y.erase({*pr-*nx,*nx});
if(it!=X.begin())Y.insert({*pr-*it,*it});
if(nx!=X.end())Y.insert({*it-*nx,*nx});
update(1,0,n-1,ind[1],ind[1],inf);
}
int u=*X.begin();
if(-(Y.begin()->F)>k-1)u=Y.begin()->S;
update(1,0,n-1,max(0,u-k+1),u-1,-1);
update(1,0,n-1,u-k+1+n,n-1,-1);
auto it=X.find(u);
auto nx=it;
auto pr=it;
if(nx!=X.end())nx++;
if(pr!=X.begin())pr--;
if(it!=X.begin()||nx!=X.end())Y.insert({*pr-*nx,*nx});
if(it!=X.begin())Y.erase({*pr-*it,*it});
if(nx!=X.end())Y.erase({*it-*nx,*nx});
X.erase(u);
b.PB(u);
}
reverse(all(b));
a.resize(n);
REP(i,0,n)a[b[i]]=i;
}
int compare_plants(int x, int y) {
if(a[x]>a[y])return 1;
return -1;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |