#include "plants.h"
#include <bits/stdc++.h>
using namespace std;
int K;
int n;
vector<int> b;
int INF = 1LL<<30;
int tree[524288];
int lazy[524288]; //min add segtree
void push(int v, int tl, int tr) {
if (tl<tr) {
lazy[2*v]+=lazy[v];
lazy[2*v+1]+=lazy[v];
}
tree[v]+=lazy[v];
lazy[v] = 0;
}
void update(int v, int l, int r, int tl, int tr, int addend) {
push(v,tl,tr);
if (l>tr || r<tl) return;
if (l<=tl && tr<=r) {
if (tl<tr) {
lazy[2*v]+=addend;
lazy[2*v+1]+=addend;
}
tree[v]+=addend;
return;
}
int m = (tl+tr)/2;
update(2*v,l,r,tl,m,addend);
update(2*v+1,l,r,m+1,tr,addend);
tree[v] = min(tree[2*v],tree[2*v+1]);
}
int query(int v, int l, int r, int tl, int tr) {
push(v,tl,tr);
if (l>tr || r<tl) return INF;
if (l<=tl && tr<=r) return tree[v];
int m = (tl+tr)/2;
return min(query(2*v,l,r,tl,m),query(2*v+1,l,r,m+1,tr));
}
int query2(int v, int l, int r, int tl, int tr) {
//cout << v <<" " << l <<" " << r <<" " << tl <<" " << tr << endl;
//finds the first 0 in range (l,r)
push(v,tl,tr);
if (l>tr || r<tl) return INF;
/*for (int i=l; i<=r; i++) {
update(1,i,i,0,262143,0); //to push
if (tree[262144+i]==0) {
return i;
}
}*/
if (tree[v]>0) return INF;
if (tl==tr) {
return tl;
}
int m = (tl+tr)/2;
int an = query2(2*v,l,r,tl,m);
if (an!=INF) {
return an;
}
return query2(2*v+1,l,r,m+1,tr);
}
vector<int> p;
vector<int> pref;
int cyclicpref(int l, int r) {
if (l<=r) {
return pref[r+1]-pref[l];
}
return (pref[n]-pref[l])+(pref[r+1]);
}
void init(int k, std::vector<int> r) {
for (int i=0; i<524288; i++) tree[i] = lazy[i] = INF;
K=k;
b=r;
n=r.size();
p=vector<int>(n,-1);
if (K==2) {
pref=vector<int>(n+1,0);
for (int i=0; i<n; i++) {
pref[i+1] = pref[i] + r[i];
}
return;
}
for (int i=0; i<n; i++) {
update(1,i,i,0,262143,r[i]);
}
//let l[i] be the number of plants j in the k-1 indices before i such that i is higher than j
//any 0 value is higher than the k-1 indices after it
//get any 0 that does not have a 0 in the k-1 indices before
//and subtract 1 from these indices
int height = n;
for (int op=0; op<n; op++) {
/*cout << "SEGTREE STATE" << endl;
for (int i=0; i<n; i++) {
cout << query(1,i,i,0,262143) <<" ";
}
cout << endl;*/
int x = query2(1,0,n-1,0,262143);
assert(x!=INF);
int li = x-k+1; li%=n; li+=n; li%=n;
int ri = x-1; ri%=n; ri+=n; ri%=n;
int an = INF;
int jambloat = -1;
if (li<=ri) {
an=min(query(1,li,ri,0,262143),INF);
}
else {
an=min(query(1,li,n-1,0,262143),query(1,0,ri,0,262143));
}
if (an!=0) {
jambloat = x;
}
else {
if (li<=ri) {
jambloat=min(query2(1,li,ri,0,262143),INF);
}
else {
if (query2(1,li,n-1,0,262143)>=INF/2) {
jambloat = query2(1,0,ri,0,262143);
}
else {
jambloat=query2(1,li,n-1,0,262143);
}
}
}
li = jambloat-k+1; li%=n; li+=n; li%=n;
ri = jambloat-1; ri%=n; ri+=n; ri%=n;
if (li<=ri) {
update(1,li,ri,0,262143,-1);
}
else {
update(1,li,n-1,0,262143,-1);
update(1,0,ri,0,262143,-1);
}
update(1,jambloat,jambloat,0,262143,INF-query(1,jambloat,jambloat,0,262143));
//cout << "doing " << jambloat << endl;
p[jambloat] = height;
height--;
}
/*for (int i=0; i<n; i++) {
cout << p[i] <<" ";
}
cout << endl;*/
return;
}
int pre(int x) {
x--;
x+=n;
x%=n;
return x;
}
int compare_plants(int x, int y) {
if (K==2) {
int c1 = cyclicpref(x,pre(y));
int c2 = cyclicpref(y,pre(x));
int m1 = (y-x+8*n)%n;
int m2 = (x-y+8*n)%n;
if (m1==c1) {
return -1;
}
if (m2==c2) {
return 1;
}
return 0;
}
if (p[x]>p[y]) return 1;
else if (p[x]<p[y]) return -1;
return 0;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
4444 KB |
Output is correct |
2 |
Correct |
2 ms |
4444 KB |
Output is correct |
3 |
Correct |
2 ms |
4444 KB |
Output is correct |
4 |
Incorrect |
2 ms |
4444 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
4444 KB |
Output is correct |
2 |
Correct |
3 ms |
4444 KB |
Output is correct |
3 |
Correct |
2 ms |
4444 KB |
Output is correct |
4 |
Correct |
2 ms |
4444 KB |
Output is correct |
5 |
Correct |
3 ms |
4420 KB |
Output is correct |
6 |
Correct |
5 ms |
4444 KB |
Output is correct |
7 |
Correct |
47 ms |
7220 KB |
Output is correct |
8 |
Correct |
3 ms |
4444 KB |
Output is correct |
9 |
Correct |
4 ms |
4608 KB |
Output is correct |
10 |
Correct |
48 ms |
7432 KB |
Output is correct |
11 |
Correct |
43 ms |
7176 KB |
Output is correct |
12 |
Correct |
44 ms |
7408 KB |
Output is correct |
13 |
Correct |
43 ms |
7252 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
4444 KB |
Output is correct |
2 |
Correct |
3 ms |
4444 KB |
Output is correct |
3 |
Correct |
2 ms |
4444 KB |
Output is correct |
4 |
Correct |
2 ms |
4444 KB |
Output is correct |
5 |
Correct |
3 ms |
4420 KB |
Output is correct |
6 |
Correct |
5 ms |
4444 KB |
Output is correct |
7 |
Correct |
47 ms |
7220 KB |
Output is correct |
8 |
Correct |
3 ms |
4444 KB |
Output is correct |
9 |
Correct |
4 ms |
4608 KB |
Output is correct |
10 |
Correct |
48 ms |
7432 KB |
Output is correct |
11 |
Correct |
43 ms |
7176 KB |
Output is correct |
12 |
Correct |
44 ms |
7408 KB |
Output is correct |
13 |
Correct |
43 ms |
7252 KB |
Output is correct |
14 |
Correct |
83 ms |
7508 KB |
Output is correct |
15 |
Correct |
487 ms |
9808 KB |
Output is correct |
16 |
Correct |
74 ms |
7484 KB |
Output is correct |
17 |
Correct |
437 ms |
9816 KB |
Output is correct |
18 |
Correct |
361 ms |
10020 KB |
Output is correct |
19 |
Correct |
354 ms |
9816 KB |
Output is correct |
20 |
Correct |
466 ms |
9952 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
2 ms |
4440 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
4440 KB |
Output is correct |
2 |
Correct |
2 ms |
4444 KB |
Output is correct |
3 |
Incorrect |
2 ms |
4444 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
4444 KB |
Output is correct |
2 |
Correct |
2 ms |
4444 KB |
Output is correct |
3 |
Incorrect |
3 ms |
4444 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
4444 KB |
Output is correct |
2 |
Correct |
2 ms |
4444 KB |
Output is correct |
3 |
Correct |
2 ms |
4444 KB |
Output is correct |
4 |
Incorrect |
2 ms |
4444 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |