This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "plants.h"
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define fs first
#define sc second
#define p_q priority_queue
using namespace std;
vector<int> rk;
struct ST{
struct no{
pair<int,int> mn;
int tag=0;
};
vector<no> st;
void init(int x){
st.resize(4*x);
}
void build(int v,int L,int R,vector<int>& a){
if(L==R){
st[v].mn={a[L],L};
return;
}
int m=(L+R)/2;
build(2*v+1,L,m,a);
build(2*v+2,m+1,R,a);
st[v].mn=min(st[2*v+1].mn,st[2*v+2].mn);
}
void upd(int v,int t){
st[v].tag+=t;
st[v].mn.fs+=t;
}
void pudo(int v){
if(st[v].tag==0){
return;
}
upd(2*v+1,st[v].tag);
upd(2*v+2,st[v].tag);
st[v].tag=0;
}
void update(int v,int L,int R,int l,int r,int t){
if(l==L && r==R){
upd(v,t);
return;
}
pudo(v);
int m=(L+R)/2;
if(r<=m){
update(2*v+1,L,m,l,r,t);
}
else if(l>m){
update(2*v+2,m+1,R,l,r,t);
}
else{
update(2*v+1,L,m,l,m,t);
update(2*v+2,m+1,R,m+1,r,t);
}
st[v].mn=min(st[2*v+1].mn,st[2*v+2].mn);
}
pair<int,int> query(int v,int L,int R,int l,int r){
if(L==l && r==R){
return st[v].mn;
}
pudo(v);
int m=(L+R)/2;
if(r<=m){
return query(2*v+1,L,m,l,r);
}
else if(l>m){
return query(2*v+2,m+1,R,l,r);
}
else{
return min(query(2*v+1,L,m,l,m),query(2*v+2,m+1,R,m+1,r));
}
}
}st;
int n,k;
set<int> s,ab;
void add(int x){
cerr << "add " << x << "\n";
if(!s.size()){
s.insert(x);
ab.insert(x);
return;
}
auto a=s.lower_bound(x);
auto b=a;
if(a==s.end()){
a=s.begin();
}
if(a==s.begin()){
b=prev(s.end());
}
else{
b=prev(a);
}
if((x-(*b)+n)%n>=k){
ab.insert(x);
}
if(((*a)-x+n)%n<k){
ab.erase(*a);
}
s.insert(x);
}
void del(int x){
cerr << "del " << x << "\n";
ab.erase(x);
s.erase(x);
if(!s.size()){
return;
}
auto a=s.lower_bound(x);
auto b=a;
if(a==s.end()){
a=s.begin();
}
if(a==s.begin()){
b=prev(s.end());
}
else{
b=prev(a);
}
ab.insert(*a);
}
void update(int l,int r){
if(l>r){
st.update(0,0,n-1,l,n-1,-1);
st.update(0,0,n-1,0,r,-1);
while(1){
auto h=st.query(0,0,n-1,0,r);
if(h.fs>0){
break;
}
add(h.sc);
st.update(0,0,n-1,h.sc,h.sc,10000008);
}
while(1){
auto h=st.query(0,0,n-1,l,n-1);
if(h.fs>0){
break;
}
add(h.sc);
st.update(0,0,n-1,h.sc,h.sc,10000008);
}
}
else{
st.update(0,0,n-1,l,r,-1);
while(1){
auto h=st.query(0,0,n-1,l,r);
if(h.fs>0){
break;
}
add(h.sc);
st.update(0,0,n-1,h.sc,h.sc,10000008);
}
}
}
void init(int K, vector<int> r) {
n=r.size();
k=K;
rk.resize(n);
st.init(n);
st.build(0,0,n-1,r);
for(int i=0;i<n;i++){
if(r[i]==0){
add(i);
st.update(0,0,n-1,i,i,10000007);
}
}
for(int i=0;i<n;i++){
auto h=*ab.begin();
auto xl=(h+1-k+n)%n;
auto xr=(h-1+n)%n;
rk[h]=i;
del(h);
update(xl,xr);
}
return;
}
int compare_plants(int x, int y) {
return rk[x]<rk[y]?1:-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... |