#include "elephants.h"
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x)
typedef long long ll;
typedef std::pair<int, int> pii;
typedef std::pair<ll , ll > pll;
using namespace std;
int L;
struct Part {
vector<int> Ps;
vector<pii> ans;
void calc_ans() {
ans.resize(Ps.size());
if (ans.empty())
return;
ans.back() = {1, Ps.back() + L};
size_t ptr = ans.size();
LoopR (i,0,(ll)ans.size()-1) {
while (Ps[ptr-1] - Ps[i] >= L)
--ptr;
ans[i].first = ptr == ans.size()? 1: ans[ptr].first + 1;
ans[i].second = ptr == ans.size()? Ps[i] + L: ans[ptr].second;
}
}
// vec must be sorted
// O(vec.size())
Part(const vector<int> &vec) {
Ps = vec;
calc_ans();
}
auto lower_bound(int x) {
// implement caching mechanism if needed
return std::lower_bound(Ps.begin(), Ps.end(), x);
}
// O(log(Ps.size()))
pii get(int p) {
auto it = lower_bound(p);
if (it == Ps.end())
return {0, p};
return ans[it - Ps.begin()];
}
// O(Ps.size())
void put(int x) {
auto it = lower_bound(x);
Ps.insert(it, x);
calc_ans();
}
// O(Ps.size())
void remove(int x) {
auto it = lower_bound(x);
assert(it != Ps.end() && *it == x);
Ps.erase(it);
calc_ans();
}
};
struct PartList {
vector<Part> parts;
vector<int> bounds;
map<int, int> pos_cnt;
static constexpr int S = 1024;
// O(nlog(n))
void init(const vector<int> &vec) {
pos_cnt.clear();
for (int x : vec)
pos_cnt[x]++;
vector<int> Ps;
for (auto [x, _] : pos_cnt)
Ps.push_back(x);
repart(Ps);
}
// Ps must be sorted
// O(Ps.size())
void repart(const vector<int> &Ps) {
bounds.clear();
parts.clear();
for (size_t i = 0; i < Ps.size(); i += S) {
size_t j = min(i + S, Ps.size());
if (j != Ps.size())
bounds.push_back(Ps[j]);
parts.emplace_back(vector(Ps.begin() + i, Ps.begin() + j));
}
}
// O(n)
void repart() {
vector<int> vec;
for (auto &p : parts)
vec.insert(vec.end(), p.Ps.begin(), p.Ps.end());
repart(vec);
}
// O(log(n) + S) + amortized O(n/S)
void move(int x, int y) {
auto &cntx = pos_cnt[x];
auto &cnty = pos_cnt[y];
if (!--cntx) {
int i = upper_bound(bounds.begin(), bounds.end(), x) - bounds.begin();
parts[i].remove(x);
}
if (!cnty++) {
int i = upper_bound(bounds.begin(), bounds.end(), y) - bounds.begin();
parts[i].put(y);
if (parts[i].Ps.size() > 2*S)
repart();
}
}
// O(n/S * log(S))
int calc() {
int ans = 0;
int pnt = 0;
for (auto &p : parts) {
auto [x, y] = p.get(pnt);
//cerr << "Ps = ";
//for (auto x : p.Ps)
// cerr << x << ", ";
//cerr << "\npnt = " << pnt << ", x = " << x << ", y = " << y << '\n';
ans += x;
pnt = y;
}
return ans;
}
};
const int N = 150'010;
PartList part_list;
int pos[N];
int n;
void init(int n_, int L_, int X[])
{
n = n_;
L = L_ + 1;
Loop (i,0,n)
pos[i] = X[i];
part_list.init(vector(pos, pos + n));
}
int update(int i, int y)
{
part_list.move(pos[i], y);
pos[i] = y;
return part_list.calc();
}
// move = O(log(n) + S) + amortized O(n/S)
// calc = O(n/S * log(S))
// q log(n) + qS + nq/S + nq/S log(S)
// qS + nq/S log(S)
// S^2 / log(S) = n
// S = 1280
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
344 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
344 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
348 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
344 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
348 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Correct |
206 ms |
4836 KB |
Output is correct |
8 |
Correct |
223 ms |
5204 KB |
Output is correct |
9 |
Correct |
206 ms |
6096 KB |
Output is correct |
10 |
Correct |
200 ms |
8180 KB |
Output is correct |
11 |
Correct |
210 ms |
8004 KB |
Output is correct |
12 |
Correct |
513 ms |
7936 KB |
Output is correct |
13 |
Correct |
214 ms |
7952 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
344 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
348 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Correct |
206 ms |
4836 KB |
Output is correct |
8 |
Correct |
223 ms |
5204 KB |
Output is correct |
9 |
Correct |
206 ms |
6096 KB |
Output is correct |
10 |
Correct |
200 ms |
8180 KB |
Output is correct |
11 |
Correct |
210 ms |
8004 KB |
Output is correct |
12 |
Correct |
513 ms |
7936 KB |
Output is correct |
13 |
Correct |
214 ms |
7952 KB |
Output is correct |
14 |
Correct |
122 ms |
5204 KB |
Output is correct |
15 |
Correct |
338 ms |
6996 KB |
Output is correct |
16 |
Correct |
805 ms |
8824 KB |
Output is correct |
17 |
Correct |
786 ms |
10564 KB |
Output is correct |
18 |
Correct |
936 ms |
10552 KB |
Output is correct |
19 |
Correct |
343 ms |
11172 KB |
Output is correct |
20 |
Correct |
861 ms |
10904 KB |
Output is correct |
21 |
Correct |
845 ms |
10996 KB |
Output is correct |
22 |
Correct |
295 ms |
11024 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
344 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
348 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Correct |
206 ms |
4836 KB |
Output is correct |
8 |
Correct |
223 ms |
5204 KB |
Output is correct |
9 |
Correct |
206 ms |
6096 KB |
Output is correct |
10 |
Correct |
200 ms |
8180 KB |
Output is correct |
11 |
Correct |
210 ms |
8004 KB |
Output is correct |
12 |
Correct |
513 ms |
7936 KB |
Output is correct |
13 |
Correct |
214 ms |
7952 KB |
Output is correct |
14 |
Correct |
122 ms |
5204 KB |
Output is correct |
15 |
Correct |
338 ms |
6996 KB |
Output is correct |
16 |
Correct |
805 ms |
8824 KB |
Output is correct |
17 |
Correct |
786 ms |
10564 KB |
Output is correct |
18 |
Correct |
936 ms |
10552 KB |
Output is correct |
19 |
Correct |
343 ms |
11172 KB |
Output is correct |
20 |
Correct |
861 ms |
10904 KB |
Output is correct |
21 |
Correct |
845 ms |
10996 KB |
Output is correct |
22 |
Correct |
295 ms |
11024 KB |
Output is correct |
23 |
Correct |
1458 ms |
19428 KB |
Output is correct |
24 |
Correct |
1301 ms |
18716 KB |
Output is correct |
25 |
Correct |
794 ms |
17692 KB |
Output is correct |
26 |
Correct |
907 ms |
23568 KB |
Output is correct |
27 |
Correct |
1142 ms |
23608 KB |
Output is correct |
28 |
Correct |
1113 ms |
8680 KB |
Output is correct |
29 |
Correct |
1066 ms |
8272 KB |
Output is correct |
30 |
Correct |
1070 ms |
8832 KB |
Output is correct |
31 |
Correct |
1059 ms |
8324 KB |
Output is correct |
32 |
Correct |
855 ms |
23388 KB |
Output is correct |
33 |
Correct |
386 ms |
15644 KB |
Output is correct |
34 |
Correct |
843 ms |
23388 KB |
Output is correct |
35 |
Correct |
337 ms |
16248 KB |
Output is correct |
36 |
Correct |
40 ms |
6376 KB |
Output is correct |
37 |
Correct |
366 ms |
15724 KB |
Output is correct |
38 |
Correct |
798 ms |
22888 KB |
Output is correct |
39 |
Correct |
911 ms |
23340 KB |
Output is correct |
40 |
Correct |
846 ms |
22944 KB |
Output is correct |
41 |
Correct |
2020 ms |
22896 KB |
Output is correct |
42 |
Correct |
2062 ms |
22368 KB |
Output is correct |