#include "elephants.h"
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long LL;
typedef vector<int> vi;
const int BLCK = 400; // sqrt n
int UPDCNTR = 0;
const int mxsz = 15e4 + 14;
int n;
LL l;
int pos[mxsz]; //ord[mxsz];
int wbl[mxsz]; // stores wbl block elephant i is in
int NUMBLOCKS;
int blocks[BLCK+10][2 * BLCK + 15];
int need[mxsz], nxt[mxsz];
int SZ[BLCK+10];
const int DMY = 15e4 + 5;
inline void workBlock(int B){
int sz = SZ[B];
if (!sz) return;
pos[DMY] = pos[blocks[B][sz-1]] + l + 1;
blocks[B][SZ[B]++] = DMY;
nxt[DMY] = DMY;
for (int i = sz-1, j = sz; i >= 0; --i){
int u = blocks[B][i];
while (pos[blocks[B][j]] - pos[blocks[B][i]] > l) j--;
j++;
int v = blocks[B][j];
need[u] = need[v] + 1;
nxt[u] = v;
}
for (int i = sz-1; i >= 0; --i)
if (nxt[blocks[B][i]] == DMY) nxt[blocks[B][i]] = blocks[B][i];
else nxt[blocks[B][i]] = nxt[nxt[blocks[B][i]]];
SZ[B]--;
}
int tmp[mxsz];
inline void rebuild(){
int now = 0;
for (int B = 0; B < NUMBLOCKS; B++){
for (int i = 0; i < SZ[B]; i++)
tmp[now++] = blocks[B][i];
SZ[B] = 0;
}
for (int i = 0, B; i < n; i++){
B = i/BLCK;
blocks[B][SZ[B]++] = tmp[i];
wbl[tmp[i]] = B;
}
for (int B = 0; B < NUMBLOCKS; B++){
workBlock(B);
}
}
inline int getAns(){
int x = -1; // next needed to cover
int ret = 0;
for (int i = 0; i < NUMBLOCKS; i++){
if (!SZ[i]) continue;
if (pos[blocks[i][SZ[i]-1]] <= x) continue;
int le = 0, ri = SZ[i] - 1, md, j = 0;
while (le <= ri){
md = (le + ri) >> 1;
if (pos[blocks[i][md]] > x){j = md; ri = md-1;}
else le = md+1;
}
ret += need[blocks[i][j]];
x = pos[nxt[blocks[i][j]]] + l;
}
return ret;
}
void init(int N, int L, int X[]){
n = N; l = L;
for (int i = 0; i < n; i++) pos[i] = X[i];
NUMBLOCKS = ((n-1)/BLCK) + 1;
for (int i = 0, B; i < n; i++){
B = i/BLCK;
blocks[B][SZ[B]++] = i;
wbl[i] = B;
}
for (int B = 0; B < NUMBLOCKS; B++){
workBlock(B);
}
}
int update(int i, int y){
int w = wbl[i];
for (int p = 0; p < SZ[w]; p++){
if (blocks[w][p] == i){
for (int j = p; j < SZ[w] - 1; j++){
blocks[w][j] = blocks[w][j+1];
}
SZ[w]--; break;
}
}
workBlock(w);
pos[i] = y;
w = 0;
for (int B = 0; B < NUMBLOCKS; B++){
if (!SZ[B]) w++;
else if (y > pos[blocks[B][SZ[B]-1]]) w++;
else break;
}
if (w >= NUMBLOCKS) w--;
int idx = SZ[w];
blocks[w][idx] = i; SZ[w]++;
while (idx > 0 && pos[blocks[w][idx]] < pos[blocks[w][idx-1]]){
swap(blocks[w][idx], blocks[w][idx - 1]); idx--;
}
workBlock(w);
wbl[i] = w;
if (++UPDCNTR >= BLCK+5){
UPDCNTR = 0;
rebuild();
}
return getAns();
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
384 KB |
Output is correct |
2 |
Correct |
2 ms |
384 KB |
Output is correct |
3 |
Correct |
2 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
384 KB |
Output is correct |
2 |
Correct |
2 ms |
384 KB |
Output is correct |
3 |
Correct |
2 ms |
384 KB |
Output is correct |
4 |
Correct |
2 ms |
384 KB |
Output is correct |
5 |
Correct |
2 ms |
384 KB |
Output is correct |
6 |
Correct |
2 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
384 KB |
Output is correct |
2 |
Correct |
2 ms |
384 KB |
Output is correct |
3 |
Correct |
2 ms |
384 KB |
Output is correct |
4 |
Correct |
2 ms |
384 KB |
Output is correct |
5 |
Correct |
2 ms |
384 KB |
Output is correct |
6 |
Correct |
2 ms |
384 KB |
Output is correct |
7 |
Correct |
307 ms |
1392 KB |
Output is correct |
8 |
Correct |
324 ms |
1536 KB |
Output is correct |
9 |
Correct |
405 ms |
2680 KB |
Output is correct |
10 |
Correct |
408 ms |
2680 KB |
Output is correct |
11 |
Correct |
370 ms |
2680 KB |
Output is correct |
12 |
Correct |
1120 ms |
2680 KB |
Output is correct |
13 |
Correct |
432 ms |
2552 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
384 KB |
Output is correct |
2 |
Correct |
2 ms |
384 KB |
Output is correct |
3 |
Correct |
2 ms |
384 KB |
Output is correct |
4 |
Correct |
2 ms |
384 KB |
Output is correct |
5 |
Correct |
2 ms |
384 KB |
Output is correct |
6 |
Correct |
2 ms |
384 KB |
Output is correct |
7 |
Correct |
307 ms |
1392 KB |
Output is correct |
8 |
Correct |
324 ms |
1536 KB |
Output is correct |
9 |
Correct |
405 ms |
2680 KB |
Output is correct |
10 |
Correct |
408 ms |
2680 KB |
Output is correct |
11 |
Correct |
370 ms |
2680 KB |
Output is correct |
12 |
Correct |
1120 ms |
2680 KB |
Output is correct |
13 |
Correct |
432 ms |
2552 KB |
Output is correct |
14 |
Correct |
526 ms |
1796 KB |
Output is correct |
15 |
Correct |
518 ms |
1912 KB |
Output is correct |
16 |
Correct |
1346 ms |
2936 KB |
Output is correct |
17 |
Correct |
1753 ms |
3436 KB |
Output is correct |
18 |
Correct |
1879 ms |
3472 KB |
Output is correct |
19 |
Correct |
804 ms |
3436 KB |
Output is correct |
20 |
Correct |
1850 ms |
3448 KB |
Output is correct |
21 |
Correct |
1900 ms |
3448 KB |
Output is correct |
22 |
Correct |
790 ms |
3544 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
384 KB |
Output is correct |
2 |
Correct |
2 ms |
384 KB |
Output is correct |
3 |
Correct |
2 ms |
384 KB |
Output is correct |
4 |
Correct |
2 ms |
384 KB |
Output is correct |
5 |
Correct |
2 ms |
384 KB |
Output is correct |
6 |
Correct |
2 ms |
384 KB |
Output is correct |
7 |
Correct |
307 ms |
1392 KB |
Output is correct |
8 |
Correct |
324 ms |
1536 KB |
Output is correct |
9 |
Correct |
405 ms |
2680 KB |
Output is correct |
10 |
Correct |
408 ms |
2680 KB |
Output is correct |
11 |
Correct |
370 ms |
2680 KB |
Output is correct |
12 |
Correct |
1120 ms |
2680 KB |
Output is correct |
13 |
Correct |
432 ms |
2552 KB |
Output is correct |
14 |
Correct |
526 ms |
1796 KB |
Output is correct |
15 |
Correct |
518 ms |
1912 KB |
Output is correct |
16 |
Correct |
1346 ms |
2936 KB |
Output is correct |
17 |
Correct |
1753 ms |
3436 KB |
Output is correct |
18 |
Correct |
1879 ms |
3472 KB |
Output is correct |
19 |
Correct |
804 ms |
3436 KB |
Output is correct |
20 |
Correct |
1850 ms |
3448 KB |
Output is correct |
21 |
Correct |
1900 ms |
3448 KB |
Output is correct |
22 |
Correct |
790 ms |
3544 KB |
Output is correct |
23 |
Correct |
4174 ms |
6876 KB |
Output is correct |
24 |
Correct |
4375 ms |
6904 KB |
Output is correct |
25 |
Correct |
3591 ms |
6908 KB |
Output is correct |
26 |
Correct |
4035 ms |
6904 KB |
Output is correct |
27 |
Correct |
4062 ms |
6904 KB |
Output is correct |
28 |
Correct |
1476 ms |
2424 KB |
Output is correct |
29 |
Correct |
1393 ms |
2396 KB |
Output is correct |
30 |
Correct |
1479 ms |
2296 KB |
Output is correct |
31 |
Correct |
1356 ms |
2440 KB |
Output is correct |
32 |
Correct |
3061 ms |
6988 KB |
Output is correct |
33 |
Correct |
2427 ms |
6880 KB |
Output is correct |
34 |
Correct |
4048 ms |
6880 KB |
Output is correct |
35 |
Correct |
2541 ms |
6916 KB |
Output is correct |
36 |
Correct |
2719 ms |
6872 KB |
Output is correct |
37 |
Correct |
6565 ms |
6872 KB |
Output is correct |
38 |
Correct |
3803 ms |
6904 KB |
Output is correct |
39 |
Correct |
3659 ms |
6872 KB |
Output is correct |
40 |
Correct |
3892 ms |
6904 KB |
Output is correct |
41 |
Correct |
6397 ms |
6904 KB |
Output is correct |
42 |
Correct |
6499 ms |
6872 KB |
Output is correct |