#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
/**
* @brief Slope-Trick
* @see https://maspypy.com/slope-trick-1-%E8%A7%A3%E8%AA%AC%E7%B7%A8
*/
template< typename T >
struct SlopeTrick {
const T INF = numeric_limits< T >::max() / 3;
T min_f;
priority_queue< T, vector< T >, less<> > L;
priority_queue< T, vector< T >, greater<> > R;
T add_l, add_r;
private:
void push_R(const T &a) {
R.push(a - add_r);
}
T top_R() const {
return R.top() + add_r;
}
T pop_R() {
T val = top_R();
R.pop();
return val;
}
void push_L(const T &a) {
L.push(a - add_l);
}
T top_L() const {
return L.top() + add_l;
}
T pop_L() {
T val = top_L();
L.pop();
return val;
}
public:
SlopeTrick() : min_f(0), add_l(0), add_r(0) {
L.push(-INF);
R.push(INF);
}
struct Query {
T lx, rx, min_f;
};
// return min f(x)
Query query() const {
return (Query) {top_L(), top_R(), min_f};
}
// f(x) += a
void add_all(const T &a) {
min_f += a;
}
// add \_
// f(x) += max(a - x, 0)
void add_a_minus_x(const T &a) {
min_f += max(T(0), a - top_R());
push_R(a);
push_L(pop_R());
}
// add _/
// f(x) += max(x - a, 0)
void add_x_minus_a(const T &a) {
min_f += max(T(0), top_L() - a);
push_L(a);
push_R(pop_L());
}
// add \/
// f(x) += abs(x - a)
void add_abs(const T &a) {
add_a_minus_x(a);
add_x_minus_a(a);
}
// void add_abs(const T &a) {
// if (a < top_L()) {
// min_f += top_L() - a;
// push_L(a);
// push_L(a);
// push_R(pop_L());
// } else if (top_R() < a) {
// min_f += a - top_R();
// push_R(a);
// push_R(a);
// push_L(pop_R());
// } else {
// push_L(a);
// push_R(a);
// }
// }
// \/ -> \_
// f_{new} (x) = min f(y) (y <= x)
void clear_right() {
while(R.size() >= 2) R.pop();
}
// \/ -> _/
// f_{new} (x) = min f(y) (y >= x)
void clear_left() {
while(L.size() >= 2) L.pop();
}
// \/. -> .\/
// f_{new} (x) = f(x - a)
void shift(const T &a) {
add_l += a;
add_r += a;
}
T get(const T &x) {
T ret = min_f;
if (!L.empty() && x < top_L()) {
while(!L.empty()) {
ret += max(T(0), pop_L() - x);
}
}
if (!R.empty() && top_R() < x) {
while(!R.empty()) {
ret += max(T(0), x - pop_R());
}
}
return ret;
}
};
const int MAXN = 5e5+7;
int a[MAXN], b[MAXN];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i] >> b[i];
SlopeTrick<LL> trick;
for (int i = 0; i < n; i++) trick.add_abs(0);
for (int i = 1; i <= n; i++) {
trick.shift(-(b[i]-a[i]));
trick.clear_left();
trick.add_abs(0);
}
cout << trick.get(0) << "\n";
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
204 KB |
Output is correct |
2 |
Correct |
1 ms |
440 KB |
Output is correct |
3 |
Correct |
2 ms |
460 KB |
Output is correct |
4 |
Correct |
33 ms |
2268 KB |
Output is correct |
5 |
Correct |
73 ms |
4140 KB |
Output is correct |
6 |
Correct |
176 ms |
8480 KB |
Output is correct |
7 |
Correct |
424 ms |
16640 KB |
Output is correct |
8 |
Correct |
344 ms |
16488 KB |
Output is correct |
9 |
Correct |
450 ms |
16476 KB |
Output is correct |
10 |
Correct |
333 ms |
16520 KB |
Output is correct |
11 |
Correct |
321 ms |
16584 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
204 KB |
Output is correct |
2 |
Correct |
1 ms |
440 KB |
Output is correct |
3 |
Correct |
2 ms |
460 KB |
Output is correct |
4 |
Correct |
33 ms |
2268 KB |
Output is correct |
5 |
Correct |
73 ms |
4140 KB |
Output is correct |
6 |
Correct |
176 ms |
8480 KB |
Output is correct |
7 |
Correct |
424 ms |
16640 KB |
Output is correct |
8 |
Correct |
344 ms |
16488 KB |
Output is correct |
9 |
Correct |
450 ms |
16476 KB |
Output is correct |
10 |
Correct |
333 ms |
16520 KB |
Output is correct |
11 |
Correct |
321 ms |
16584 KB |
Output is correct |
12 |
Correct |
89 ms |
4548 KB |
Output is correct |
13 |
Correct |
243 ms |
13356 KB |
Output is correct |
14 |
Correct |
462 ms |
16628 KB |
Output is correct |
15 |
Correct |
356 ms |
16536 KB |
Output is correct |
16 |
Correct |
421 ms |
16456 KB |
Output is correct |
17 |
Correct |
249 ms |
16520 KB |
Output is correct |
18 |
Correct |
2 ms |
460 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
204 KB |
Output is correct |
2 |
Correct |
1 ms |
440 KB |
Output is correct |
3 |
Correct |
2 ms |
460 KB |
Output is correct |
4 |
Correct |
0 ms |
204 KB |
Output is correct |
5 |
Correct |
1 ms |
332 KB |
Output is correct |
6 |
Correct |
1 ms |
332 KB |
Output is correct |
7 |
Correct |
2 ms |
460 KB |
Output is correct |
8 |
Correct |
2 ms |
460 KB |
Output is correct |
9 |
Correct |
2 ms |
460 KB |
Output is correct |
10 |
Correct |
2 ms |
460 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
204 KB |
Output is correct |
2 |
Correct |
1 ms |
440 KB |
Output is correct |
3 |
Correct |
2 ms |
460 KB |
Output is correct |
4 |
Correct |
0 ms |
204 KB |
Output is correct |
5 |
Correct |
1 ms |
332 KB |
Output is correct |
6 |
Correct |
1 ms |
332 KB |
Output is correct |
7 |
Correct |
2 ms |
460 KB |
Output is correct |
8 |
Correct |
2 ms |
460 KB |
Output is correct |
9 |
Correct |
2 ms |
460 KB |
Output is correct |
10 |
Correct |
2 ms |
460 KB |
Output is correct |
11 |
Correct |
2 ms |
460 KB |
Output is correct |
12 |
Correct |
2 ms |
332 KB |
Output is correct |
13 |
Correct |
3 ms |
460 KB |
Output is correct |
14 |
Correct |
2 ms |
460 KB |
Output is correct |
15 |
Correct |
2 ms |
460 KB |
Output is correct |
16 |
Correct |
2 ms |
460 KB |
Output is correct |
17 |
Correct |
2 ms |
460 KB |
Output is correct |
18 |
Correct |
2 ms |
460 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
204 KB |
Output is correct |
2 |
Correct |
1 ms |
440 KB |
Output is correct |
3 |
Correct |
2 ms |
460 KB |
Output is correct |
4 |
Correct |
0 ms |
204 KB |
Output is correct |
5 |
Correct |
1 ms |
332 KB |
Output is correct |
6 |
Correct |
1 ms |
332 KB |
Output is correct |
7 |
Correct |
2 ms |
460 KB |
Output is correct |
8 |
Correct |
2 ms |
460 KB |
Output is correct |
9 |
Correct |
2 ms |
460 KB |
Output is correct |
10 |
Correct |
2 ms |
460 KB |
Output is correct |
11 |
Correct |
33 ms |
2268 KB |
Output is correct |
12 |
Correct |
73 ms |
4140 KB |
Output is correct |
13 |
Correct |
176 ms |
8480 KB |
Output is correct |
14 |
Correct |
424 ms |
16640 KB |
Output is correct |
15 |
Correct |
344 ms |
16488 KB |
Output is correct |
16 |
Correct |
450 ms |
16476 KB |
Output is correct |
17 |
Correct |
333 ms |
16520 KB |
Output is correct |
18 |
Correct |
321 ms |
16584 KB |
Output is correct |
19 |
Correct |
89 ms |
4548 KB |
Output is correct |
20 |
Correct |
243 ms |
13356 KB |
Output is correct |
21 |
Correct |
462 ms |
16628 KB |
Output is correct |
22 |
Correct |
356 ms |
16536 KB |
Output is correct |
23 |
Correct |
421 ms |
16456 KB |
Output is correct |
24 |
Correct |
249 ms |
16520 KB |
Output is correct |
25 |
Correct |
2 ms |
332 KB |
Output is correct |
26 |
Correct |
3 ms |
460 KB |
Output is correct |
27 |
Correct |
2 ms |
460 KB |
Output is correct |
28 |
Correct |
2 ms |
460 KB |
Output is correct |
29 |
Correct |
2 ms |
460 KB |
Output is correct |
30 |
Correct |
2 ms |
460 KB |
Output is correct |
31 |
Correct |
2 ms |
460 KB |
Output is correct |
32 |
Correct |
2 ms |
460 KB |
Output is correct |
33 |
Correct |
80 ms |
4528 KB |
Output is correct |
34 |
Correct |
169 ms |
13456 KB |
Output is correct |
35 |
Correct |
374 ms |
16512 KB |
Output is correct |
36 |
Correct |
303 ms |
16476 KB |
Output is correct |
37 |
Correct |
340 ms |
16524 KB |
Output is correct |
38 |
Correct |
438 ms |
16596 KB |
Output is correct |
39 |
Correct |
272 ms |
16532 KB |
Output is correct |
40 |
Correct |
239 ms |
15784 KB |
Output is correct |
41 |
Correct |
251 ms |
16508 KB |
Output is correct |
42 |
Correct |
245 ms |
16524 KB |
Output is correct |
43 |
Correct |
243 ms |
16504 KB |
Output is correct |
44 |
Correct |
279 ms |
16524 KB |
Output is correct |
45 |
Correct |
415 ms |
16532 KB |
Output is correct |
46 |
Correct |
269 ms |
16472 KB |
Output is correct |
47 |
Correct |
253 ms |
14744 KB |
Output is correct |