#include "plants.h"
#include <bits/stdc++.h>
using namespace std;
#define maxn 200200
#define inf 1000000
#define pii pair<int,int>
#define debug
#define pb push_back
int N;
int T[4*maxn];
int id[4*maxn];
int lazy[8*maxn];
int H[maxn];
void refresh(int ini,int fim,int p){
lazy[2*p] += lazy[p];
lazy[2*p+1] += lazy[p];
T[p] -= lazy[p];
lazy[p] = 0;
}
void upd(int ini,int fim,int p,int pos,int val){
refresh(ini,fim,p);
if(pos < ini || pos > fim) return;
if(ini == fim){
T[p] = val;
id[p] = pos;
return;
}
int mid = (ini+fim)/2;
upd(ini,mid,2*p,pos,val);
upd(mid+1,fim,2*p+1,pos,val);
if(T[2*p] < T[2*p+1]){
T[p] = T[2*p];
id[p] = id[2*p];
}
else {
T[p] = T[2*p+1];
id[p] = id[2*p+1];
}
}
void dec(int ini,int fim,int p,int l,int r){
refresh(ini,fim,p);
if(l > fim || r < ini)
return;
if(ini >= l && fim <= r){
lazy[p]++;
refresh(ini,fim,p);
return;
}
int mid = (ini+fim)/2;
dec(ini,mid,2*p,l,r);
dec(mid+1,fim,2*p+1,l,r);
if(T[2*p] < T[2*p+1]){
T[p] = T[2*p];
id[p] = id[2*p];
}
else {
T[p] = T[2*p+1];
id[p] = id[2*p+1];
}
}
vector<int> zeroes(){
vector<int> ret;
while(T[1] == 0){
int pos = id[1];
ret.pb(pos);
upd(0,N-1,1,pos,inf);
}
return ret;
}
set<pii> S;
set<pii> Si;
pii rev(pii a){
return {a.second,a.first};
}
void add(int x){
debug("add %d:\n",x);
if(S.size() == 0){
S.insert({x,N});
Si.insert({N,x});
return;
}
pii nx;
if(S.lower_bound({x,inf}) != S.end())
nx = *S.lower_bound({x,inf});
else {
nx = *S.begin();
}
pii lst;
if(S.lower_bound({x,inf}) != S.begin())
lst = *--S.lower_bound({x,inf});
else {
lst = *--S.end();
lst.first -= N;
}
debug(" -(%d,%d)\n",nx.first,nx.second);
S.erase(S.find(nx));
Si.erase(Si.find(rev(nx)));
if(nx.first < x)
nx.first += N;
debug(" +(%d,%d)\n",nx.first%N,nx.first-x);
S.insert({nx.first%N,nx.first-x});
Si.insert({nx.first-x,nx.first%N});
debug(" +(%d,%d)\n",x,x-lst.first);
S.insert({x,x-lst.first});
Si.insert({x-lst.first,x});
debug("\n\n");
}
void rem(int x){
debug("rem %d:\n",x);
if(S.size() == 1){
S.clear();
Si.clear();
return;
}
pii it = *S.lower_bound({x,-1});
pii nx;
if(S.lower_bound({x,inf}) != S.end())
nx = *S.lower_bound({x,inf});
else
nx = *S.begin();
debug(" -(%d,%d)\n",it.first,it.second);
debug(" -(%d,%d)\n",nx.first,nx.second);
S.erase(S.find(it));
Si.erase(Si.find(rev(it)));
S.erase(S.find(nx));
Si.erase(Si.find(rev(nx)));
debug(" +(%d,%d)\n",nx.first,nx.second+it.second);
S.insert({nx.first,nx.second+it.second});
Si.insert({nx.second+it.second,nx.first});
}
int acha(){
debug("tem %d\n",(int)S.size());
return (--Si.end()) -> second;
int ans = 0, opt = 0;
for(auto i : S){
debug("(%d;%d)\n",i.first,i.second);
if(i.second > opt){
opt = i.second;
ans = i.first;
}
}
return ans;
}
void go(int n, int k, int x, vector<int> r){
N = n;
for(int i=0;i<n;i++)
upd(0,N-1,1,i,r[i]);
int foi = 0;
while(foi < n){
vector<int> v = zeroes();
for(int i : v)
add(i);
int id = acha();
rem(id);
debug("pega %d\n",id);
H[id] = n-foi;
foi++;
dec(0,N-1,1,max(0,id-k+1),id-1);
if(id-k+1 < 0)
dec(0,N-1,1,id-k+1+N,N-1);
}
}
void init(int k, std::vector<int> r) {
go(r.size(), k, 0, r);
return;
}
int compare_plants(int x, int y) {
if(H[x] > H[y])
return 1;
else
return -1;
return 0;
}
Compilation message
plants.cpp: In function 'void add(int)':
plants.cpp:93:8: warning: left operand of comma operator has no effect [-Wunused-value]
93 | debug("add %d:\n",x);
| ^~~~~~~~~~~
plants.cpp:116:8: warning: left operand of comma operator has no effect [-Wunused-value]
116 | debug(" -(%d,%d)\n",nx.first,nx.second);
| ^~~~~~~~~~~~~
plants.cpp:116:25: warning: right operand of comma operator has no effect [-Wunused-value]
116 | debug(" -(%d,%d)\n",nx.first,nx.second);
| ~~~^~~~~
plants.cpp:123:8: warning: left operand of comma operator has no effect [-Wunused-value]
123 | debug(" +(%d,%d)\n",nx.first%N,nx.first-x);
| ^~~~~~~~~~~~~
plants.cpp:123:30: warning: right operand of comma operator has no effect [-Wunused-value]
123 | debug(" +(%d,%d)\n",nx.first%N,nx.first-x);
| ~~~~~~~~^~
plants.cpp:126:8: warning: left operand of comma operator has no effect [-Wunused-value]
126 | debug(" +(%d,%d)\n",x,x-lst.first);
| ^~~~~~~~~~~~~
plants.cpp:126:30: warning: right operand of comma operator has no effect [-Wunused-value]
126 | debug(" +(%d,%d)\n",x,x-lst.first);
| ^~~~~
plants.cpp:129:8: warning: statement has no effect [-Wunused-value]
129 | debug("\n\n");
| ~^~~~~~~
plants.cpp: In function 'void rem(int)':
plants.cpp:134:8: warning: left operand of comma operator has no effect [-Wunused-value]
134 | debug("rem %d:\n",x);
| ^~~~~~~~~~~
plants.cpp:151:8: warning: left operand of comma operator has no effect [-Wunused-value]
151 | debug(" -(%d,%d)\n",it.first,it.second);
| ^~~~~~~~~~~~~
plants.cpp:151:25: warning: right operand of comma operator has no effect [-Wunused-value]
151 | debug(" -(%d,%d)\n",it.first,it.second);
| ~~~^~~~~
plants.cpp:152:8: warning: left operand of comma operator has no effect [-Wunused-value]
152 | debug(" -(%d,%d)\n",nx.first,nx.second);
| ^~~~~~~~~~~~~
plants.cpp:152:25: warning: right operand of comma operator has no effect [-Wunused-value]
152 | debug(" -(%d,%d)\n",nx.first,nx.second);
| ~~~^~~~~
plants.cpp:158:8: warning: left operand of comma operator has no effect [-Wunused-value]
158 | debug(" +(%d,%d)\n",nx.first,nx.second+it.second);
| ^~~~~~~~~~~~~
plants.cpp:158:25: warning: right operand of comma operator has no effect [-Wunused-value]
158 | debug(" +(%d,%d)\n",nx.first,nx.second+it.second);
| ~~~^~~~~
plants.cpp: In function 'int acha()':
plants.cpp:165:8: warning: left operand of comma operator has no effect [-Wunused-value]
165 | debug("tem %d\n",(int)S.size());
| ^~~~~~~~~~
plants.cpp:169:9: warning: left operand of comma operator has no effect [-Wunused-value]
169 | debug("(%d;%d)\n",i.first,i.second);
| ^~~~~~~~~~~
plants.cpp:169:23: warning: right operand of comma operator has no effect [-Wunused-value]
169 | debug("(%d;%d)\n",i.first,i.second);
| ~~^~~~~
plants.cpp: In function 'void go(int, int, int, std::vector<int>)':
plants.cpp:198:9: warning: left operand of comma operator has no effect [-Wunused-value]
198 | debug("pega %d\n",id);
| ^~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
384 KB |
Output is correct |
2 |
Correct |
0 ms |
384 KB |
Output is correct |
3 |
Correct |
1 ms |
384 KB |
Output is correct |
4 |
Incorrect |
1 ms |
384 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
384 KB |
Output is correct |
2 |
Correct |
0 ms |
384 KB |
Output is correct |
3 |
Correct |
0 ms |
384 KB |
Output is correct |
4 |
Correct |
0 ms |
384 KB |
Output is correct |
5 |
Correct |
1 ms |
384 KB |
Output is correct |
6 |
Correct |
3 ms |
512 KB |
Output is correct |
7 |
Correct |
77 ms |
3576 KB |
Output is correct |
8 |
Correct |
3 ms |
384 KB |
Output is correct |
9 |
Correct |
3 ms |
512 KB |
Output is correct |
10 |
Correct |
84 ms |
3576 KB |
Output is correct |
11 |
Correct |
82 ms |
3708 KB |
Output is correct |
12 |
Correct |
80 ms |
3704 KB |
Output is correct |
13 |
Correct |
77 ms |
3576 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
384 KB |
Output is correct |
2 |
Correct |
0 ms |
384 KB |
Output is correct |
3 |
Correct |
0 ms |
384 KB |
Output is correct |
4 |
Correct |
0 ms |
384 KB |
Output is correct |
5 |
Correct |
1 ms |
384 KB |
Output is correct |
6 |
Correct |
3 ms |
512 KB |
Output is correct |
7 |
Correct |
77 ms |
3576 KB |
Output is correct |
8 |
Correct |
3 ms |
384 KB |
Output is correct |
9 |
Correct |
3 ms |
512 KB |
Output is correct |
10 |
Correct |
84 ms |
3576 KB |
Output is correct |
11 |
Correct |
82 ms |
3708 KB |
Output is correct |
12 |
Correct |
80 ms |
3704 KB |
Output is correct |
13 |
Correct |
77 ms |
3576 KB |
Output is correct |
14 |
Correct |
116 ms |
4572 KB |
Output is correct |
15 |
Correct |
662 ms |
14200 KB |
Output is correct |
16 |
Correct |
118 ms |
4492 KB |
Output is correct |
17 |
Correct |
656 ms |
14200 KB |
Output is correct |
18 |
Correct |
872 ms |
23396 KB |
Output is correct |
19 |
Correct |
423 ms |
14200 KB |
Output is correct |
20 |
Correct |
575 ms |
14072 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
384 KB |
Output is correct |
2 |
Correct |
0 ms |
384 KB |
Output is correct |
3 |
Correct |
72 ms |
3316 KB |
Output is correct |
4 |
Correct |
602 ms |
20396 KB |
Output is correct |
5 |
Correct |
614 ms |
15552 KB |
Output is correct |
6 |
Correct |
740 ms |
14200 KB |
Output is correct |
7 |
Correct |
758 ms |
14200 KB |
Output is correct |
8 |
Correct |
675 ms |
14208 KB |
Output is correct |
9 |
Correct |
664 ms |
18800 KB |
Output is correct |
10 |
Correct |
683 ms |
15608 KB |
Output is correct |
11 |
Correct |
751 ms |
32876 KB |
Output is correct |
12 |
Correct |
362 ms |
14076 KB |
Output is correct |
13 |
Correct |
833 ms |
27460 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
384 KB |
Output is correct |
2 |
Correct |
1 ms |
512 KB |
Output is correct |
3 |
Incorrect |
1 ms |
384 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
288 KB |
Output is correct |
2 |
Correct |
0 ms |
384 KB |
Output is correct |
3 |
Incorrect |
1 ms |
384 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
384 KB |
Output is correct |
2 |
Correct |
0 ms |
384 KB |
Output is correct |
3 |
Correct |
1 ms |
384 KB |
Output is correct |
4 |
Incorrect |
1 ms |
384 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |