#include "plants.h"
#include "bits/stdc++.h"
using namespace std;
#define ar array
typedef long long ll;
//~ #define int ll
const int inf = 1e9;
const int N = 2e5 + 5;
const int M = 20;
struct ST{
ar<ll, 2> tree[N << 2];
ll f[N << 2];
void build(int lx, int rx, int x){
if(lx == rx) { tree[x][1] = lx; return; };
int m = (lx + rx) >> 1;
build(lx, m, x << 1), build(m + 1, rx, x << 1 | 1);
tree[x][1] = lx;
}
ST(){
build(0, N, 1);
}
void push(int x, int lx, int rx){
if(lx == rx) return;
tree[x << 1][0] += f[x];
tree[x << 1 | 1][0] += f[x];
f[x << 1] += f[x], f[x << 1 | 1] += f[x];
f[x] = 0;
}
void add(int l, int r, int v, int lx, int rx, int x){
if(lx > r || rx < l) return;
if(lx >= l && rx <= r){
tree[x][0] += v;
f[x] += v;
return;
}
push(x, lx, rx);
int m = (lx + rx) >> 1;
add(l, r, v, lx, m, x << 1), add(l, r, v, m + 1, rx, x << 1 | 1);
tree[x] = min(tree[x << 1], tree[x << 1 | 1]);
}
void add(int l, int r, int v) { return add(l, r, v, 0, N, 1); }
ar<ll, 2> get(int l, int r, int lx, int rx, int x){
if(lx > r || rx < l) return {inf, inf};
if(lx >= l && rx <= r) return tree[x];
push(x, lx, rx);
int m = (lx + rx) >> 1;
return min(get(l, r, lx, m, x << 1), get(l, r, m + 1, rx, x << 1 | 1));
}
ar<ll, 2> get(int l, int r){
return get(l, r, 0, N, 1);
}
}tree, R, builder, buildel;
vector<int> a;
vector<vector<int>> l_, r_;
int n;
void init(int k, vector<int> r) {
n = r.size();
a.resize(n);
l_.resize(n, vector<int>(M, -1));
r_.resize(n, vector<int>(M, -1));
{
int cnt = 0;
for(int i=0;i<k - 1;i++) cnt += (r[i] == 0);
for(int i=k - 1;;){
tree.add(i, i, r[i] + cnt);
buildel.add(i, i, 1);
builder.add(i, i, 1);
if(r[i]){
R.add(i, i, r[i]);
} else {
R.add(i, i, inf);
}
cnt -= (r[(i + n - k + 1) % n] == 0);
cnt += (r[i] == 0);
i = (i + 1) % n;
if(i == k - 1) break;
}
}
auto to_r = [&](int p){
int l = p, r = p + k - 1;
ar<ll, 2> pp = buildel.get(l, min(r, n - 1));
if(!pp[0] || r < n) return pp;
return buildel.get(0, r - n);
};
auto to_l = [&](int p){
int l = p - k + 1, r = p;
ar<ll, 2> pp = builder.get(max(l, 0), r);
if(!pp[0] || 0 <= l) return pp;
return builder.get(n + l, n - 1);
};
for(int j=n;j>0;j--){
//~ for(int i=0;i<n;i++) cout<<tree.get(i, i)[0]<<" ";
//~ cout<<"\n";
auto [v, p] = tree.get(0, n - 1);
{
ar<ll, 2> pp = to_r(p);
while(pp[0] == 0){
l_[pp[1]][0] = p;
buildel.add(pp[1], pp[1], 1);
pp = to_r(p);
}
pp = to_l(p);
while(pp[0] == 0){
r_[pp[1]][0] = p;
builder.add(pp[1], pp[1], 1);
pp = to_l(p);
}
}
assert(v == 0);
buildel.add(p, p, -1);
builder.add(p, p, -1);
a[p] = j;
R.add(p, p, inf);
tree.add(p, p, inf);
{
int l = p - k + 1, r = p;
tree.add(max(l, 0), r, -1);
R.add(max(l, 0), r, -1);
if(l < 0) tree.add(n + l, n - 1, -1);
if(l < 0) R.add(n + l, n - 1, -1);
ar<ll, 2> pp = R.get(0, n - 1);
while(pp[0] == 0){
R.add(pp[1], pp[1], inf);
{
int l = pp[1] + 1, r = pp[1] + k - 1;
tree.add(l, min(r, n - 1), 1);
if(n <= r) tree.add(0, r - n, 1);
}
pp = R.get(0, n - 1);
}
}
{
int l = p, r = p + k - 1;
tree.add(l, min(r, n - 1), -1);
if(n <= r) tree.add(0, r - n, -1);
}
}
for(int i=0;i<n;i++){
if(~l_[i][0]) l_[i][0] = (i - l_[i][0] + n) % n;
else l_[i][0] = 0;
if(~r_[i][0]) r_[i][0] = (r_[i][0] - i + n) % n;
else r_[i][0] = 0;
}
for(int j=1;j<M;j++){
for(int i=0;i<n;i++){
if(l_[i][j - 1] >= n) l_[i][j] = l_[i][j - 1];
else l_[i][j] = l_[i][j - 1] + l_[(i - l_[i][j - 1] + n) % n][j - 1];
if(r_[i][j - 1] >= n) r_[i][j] = r_[i][j - 1];
else r_[i][j] = r_[i][j - 1] + r_[(i + r_[i][j - 1]) % n][j - 1];
}
}
return;
}
bool check(int x, int y){
{
int cur = x, dis = (x - y + n) % n;
for(int j=19;~j;j--){
if(dis > l_[cur][j]){
dis -= l_[cur][j];
cur -= l_[cur][j];
while(cur < 0) cur += n;
}
}
if(l_[cur][0] && a[(y + dis) % n] > a[y]) return true;
}
{
int cur = x, dis = (y - x + n) % n;
for(int j=19;~j;j--){
if(dis > r_[cur][j]){
dis -= r_[cur][j];
cur += r_[cur][j];
while(cur >= n) cur -= n;
}
}
if(r_[cur][0] && a[(y - dis + n) % n] > a[y]) return true;
}
return false;
}
int compare_plants(int x, int y) {
if(check(x, y)) return 1;
if(check(y, x)) return -1;
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
13 ms |
33364 KB |
Output is correct |
2 |
Correct |
12 ms |
33364 KB |
Output is correct |
3 |
Correct |
12 ms |
33336 KB |
Output is correct |
4 |
Correct |
12 ms |
33312 KB |
Output is correct |
5 |
Correct |
12 ms |
33292 KB |
Output is correct |
6 |
Correct |
83 ms |
36100 KB |
Output is correct |
7 |
Correct |
189 ms |
42652 KB |
Output is correct |
8 |
Correct |
1086 ms |
101272 KB |
Output is correct |
9 |
Correct |
1118 ms |
101276 KB |
Output is correct |
10 |
Correct |
1090 ms |
101272 KB |
Output is correct |
11 |
Correct |
1088 ms |
101192 KB |
Output is correct |
12 |
Correct |
1171 ms |
101280 KB |
Output is correct |
13 |
Correct |
1046 ms |
101280 KB |
Output is correct |
14 |
Correct |
1237 ms |
101272 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
13 ms |
33364 KB |
Output is correct |
2 |
Correct |
13 ms |
33296 KB |
Output is correct |
3 |
Correct |
14 ms |
33364 KB |
Output is correct |
4 |
Correct |
13 ms |
33300 KB |
Output is correct |
5 |
Correct |
14 ms |
33364 KB |
Output is correct |
6 |
Correct |
22 ms |
33748 KB |
Output is correct |
7 |
Correct |
104 ms |
37840 KB |
Output is correct |
8 |
Correct |
15 ms |
33364 KB |
Output is correct |
9 |
Correct |
21 ms |
33712 KB |
Output is correct |
10 |
Correct |
102 ms |
37832 KB |
Output is correct |
11 |
Correct |
113 ms |
37832 KB |
Output is correct |
12 |
Correct |
130 ms |
37832 KB |
Output is correct |
13 |
Correct |
102 ms |
37796 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
13 ms |
33364 KB |
Output is correct |
2 |
Correct |
13 ms |
33296 KB |
Output is correct |
3 |
Correct |
14 ms |
33364 KB |
Output is correct |
4 |
Correct |
13 ms |
33300 KB |
Output is correct |
5 |
Correct |
14 ms |
33364 KB |
Output is correct |
6 |
Correct |
22 ms |
33748 KB |
Output is correct |
7 |
Correct |
104 ms |
37840 KB |
Output is correct |
8 |
Correct |
15 ms |
33364 KB |
Output is correct |
9 |
Correct |
21 ms |
33712 KB |
Output is correct |
10 |
Correct |
102 ms |
37832 KB |
Output is correct |
11 |
Correct |
113 ms |
37832 KB |
Output is correct |
12 |
Correct |
130 ms |
37832 KB |
Output is correct |
13 |
Correct |
102 ms |
37796 KB |
Output is correct |
14 |
Correct |
248 ms |
42648 KB |
Output is correct |
15 |
Correct |
2250 ms |
101276 KB |
Output is correct |
16 |
Correct |
219 ms |
42732 KB |
Output is correct |
17 |
Correct |
2256 ms |
101272 KB |
Output is correct |
18 |
Correct |
1510 ms |
101280 KB |
Output is correct |
19 |
Correct |
1626 ms |
101276 KB |
Output is correct |
20 |
Correct |
2059 ms |
101280 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
13 ms |
33364 KB |
Output is correct |
2 |
Correct |
14 ms |
33268 KB |
Output is correct |
3 |
Correct |
94 ms |
36740 KB |
Output is correct |
4 |
Correct |
1449 ms |
101280 KB |
Output is correct |
5 |
Correct |
1701 ms |
101412 KB |
Output is correct |
6 |
Correct |
2058 ms |
101268 KB |
Output is correct |
7 |
Correct |
2256 ms |
101272 KB |
Output is correct |
8 |
Correct |
2260 ms |
101280 KB |
Output is correct |
9 |
Correct |
1508 ms |
101276 KB |
Output is correct |
10 |
Correct |
1508 ms |
101272 KB |
Output is correct |
11 |
Correct |
1060 ms |
101164 KB |
Output is correct |
12 |
Correct |
1328 ms |
101280 KB |
Output is correct |
13 |
Correct |
1439 ms |
101272 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
13 ms |
33340 KB |
Output is correct |
2 |
Correct |
13 ms |
33340 KB |
Output is correct |
3 |
Correct |
14 ms |
33264 KB |
Output is correct |
4 |
Correct |
13 ms |
33308 KB |
Output is correct |
5 |
Correct |
13 ms |
33372 KB |
Output is correct |
6 |
Correct |
16 ms |
33364 KB |
Output is correct |
7 |
Correct |
34 ms |
34044 KB |
Output is correct |
8 |
Correct |
27 ms |
34016 KB |
Output is correct |
9 |
Correct |
31 ms |
33992 KB |
Output is correct |
10 |
Correct |
27 ms |
34072 KB |
Output is correct |
11 |
Correct |
32 ms |
33988 KB |
Output is correct |
12 |
Correct |
31 ms |
33984 KB |
Output is correct |
13 |
Correct |
26 ms |
34104 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
14 ms |
33336 KB |
Output is correct |
2 |
Correct |
12 ms |
33364 KB |
Output is correct |
3 |
Correct |
13 ms |
33364 KB |
Output is correct |
4 |
Correct |
12 ms |
33364 KB |
Output is correct |
5 |
Correct |
19 ms |
33620 KB |
Output is correct |
6 |
Correct |
1540 ms |
101280 KB |
Output is correct |
7 |
Correct |
1909 ms |
101272 KB |
Output is correct |
8 |
Correct |
2052 ms |
101272 KB |
Output is correct |
9 |
Correct |
2290 ms |
101280 KB |
Output is correct |
10 |
Correct |
1363 ms |
101356 KB |
Output is correct |
11 |
Correct |
1743 ms |
101272 KB |
Output is correct |
12 |
Correct |
1320 ms |
101276 KB |
Output is correct |
13 |
Correct |
1611 ms |
101356 KB |
Output is correct |
14 |
Correct |
1921 ms |
101280 KB |
Output is correct |
15 |
Correct |
2105 ms |
101276 KB |
Output is correct |
16 |
Correct |
1338 ms |
101276 KB |
Output is correct |
17 |
Correct |
1494 ms |
101268 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
13 ms |
33364 KB |
Output is correct |
2 |
Correct |
12 ms |
33364 KB |
Output is correct |
3 |
Correct |
12 ms |
33336 KB |
Output is correct |
4 |
Correct |
12 ms |
33312 KB |
Output is correct |
5 |
Correct |
12 ms |
33292 KB |
Output is correct |
6 |
Correct |
83 ms |
36100 KB |
Output is correct |
7 |
Correct |
189 ms |
42652 KB |
Output is correct |
8 |
Correct |
1086 ms |
101272 KB |
Output is correct |
9 |
Correct |
1118 ms |
101276 KB |
Output is correct |
10 |
Correct |
1090 ms |
101272 KB |
Output is correct |
11 |
Correct |
1088 ms |
101192 KB |
Output is correct |
12 |
Correct |
1171 ms |
101280 KB |
Output is correct |
13 |
Correct |
1046 ms |
101280 KB |
Output is correct |
14 |
Correct |
1237 ms |
101272 KB |
Output is correct |
15 |
Correct |
13 ms |
33364 KB |
Output is correct |
16 |
Correct |
13 ms |
33296 KB |
Output is correct |
17 |
Correct |
14 ms |
33364 KB |
Output is correct |
18 |
Correct |
13 ms |
33300 KB |
Output is correct |
19 |
Correct |
14 ms |
33364 KB |
Output is correct |
20 |
Correct |
22 ms |
33748 KB |
Output is correct |
21 |
Correct |
104 ms |
37840 KB |
Output is correct |
22 |
Correct |
15 ms |
33364 KB |
Output is correct |
23 |
Correct |
21 ms |
33712 KB |
Output is correct |
24 |
Correct |
102 ms |
37832 KB |
Output is correct |
25 |
Correct |
113 ms |
37832 KB |
Output is correct |
26 |
Correct |
130 ms |
37832 KB |
Output is correct |
27 |
Correct |
102 ms |
37796 KB |
Output is correct |
28 |
Correct |
248 ms |
42648 KB |
Output is correct |
29 |
Correct |
2250 ms |
101276 KB |
Output is correct |
30 |
Correct |
219 ms |
42732 KB |
Output is correct |
31 |
Correct |
2256 ms |
101272 KB |
Output is correct |
32 |
Correct |
1510 ms |
101280 KB |
Output is correct |
33 |
Correct |
1626 ms |
101276 KB |
Output is correct |
34 |
Correct |
2059 ms |
101280 KB |
Output is correct |
35 |
Correct |
13 ms |
33364 KB |
Output is correct |
36 |
Correct |
14 ms |
33268 KB |
Output is correct |
37 |
Correct |
94 ms |
36740 KB |
Output is correct |
38 |
Correct |
1449 ms |
101280 KB |
Output is correct |
39 |
Correct |
1701 ms |
101412 KB |
Output is correct |
40 |
Correct |
2058 ms |
101268 KB |
Output is correct |
41 |
Correct |
2256 ms |
101272 KB |
Output is correct |
42 |
Correct |
2260 ms |
101280 KB |
Output is correct |
43 |
Correct |
1508 ms |
101276 KB |
Output is correct |
44 |
Correct |
1508 ms |
101272 KB |
Output is correct |
45 |
Correct |
1060 ms |
101164 KB |
Output is correct |
46 |
Correct |
1328 ms |
101280 KB |
Output is correct |
47 |
Correct |
1439 ms |
101272 KB |
Output is correct |
48 |
Correct |
13 ms |
33340 KB |
Output is correct |
49 |
Correct |
13 ms |
33340 KB |
Output is correct |
50 |
Correct |
14 ms |
33264 KB |
Output is correct |
51 |
Correct |
13 ms |
33308 KB |
Output is correct |
52 |
Correct |
13 ms |
33372 KB |
Output is correct |
53 |
Correct |
16 ms |
33364 KB |
Output is correct |
54 |
Correct |
34 ms |
34044 KB |
Output is correct |
55 |
Correct |
27 ms |
34016 KB |
Output is correct |
56 |
Correct |
31 ms |
33992 KB |
Output is correct |
57 |
Correct |
27 ms |
34072 KB |
Output is correct |
58 |
Correct |
32 ms |
33988 KB |
Output is correct |
59 |
Correct |
31 ms |
33984 KB |
Output is correct |
60 |
Correct |
26 ms |
34104 KB |
Output is correct |
61 |
Correct |
119 ms |
36680 KB |
Output is correct |
62 |
Correct |
235 ms |
42640 KB |
Output is correct |
63 |
Correct |
1407 ms |
101276 KB |
Output is correct |
64 |
Correct |
1630 ms |
101280 KB |
Output is correct |
65 |
Correct |
1950 ms |
101280 KB |
Output is correct |
66 |
Correct |
2114 ms |
101276 KB |
Output is correct |
67 |
Correct |
2188 ms |
101272 KB |
Output is correct |
68 |
Correct |
1468 ms |
101304 KB |
Output is correct |
69 |
Correct |
1894 ms |
101276 KB |
Output is correct |
70 |
Correct |
1414 ms |
101276 KB |
Output is correct |
71 |
Correct |
1671 ms |
101328 KB |
Output is correct |
72 |
Correct |
2031 ms |
101388 KB |
Output is correct |
73 |
Correct |
2121 ms |
101148 KB |
Output is correct |
74 |
Correct |
1409 ms |
101276 KB |
Output is correct |
75 |
Correct |
1453 ms |
101164 KB |
Output is correct |