# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
795107 |
2023-07-27T06:38:51 Z |
ymm |
Meetings (IOI18_meetings) |
C++17 |
|
2441 ms |
479456 KB |
#include "meetings.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;
const int N = 1e6+10;
ll eval(const pll &f, ll x) { return f.first * x + f.second; }
namespace seg {
struct node {
pll val;
ll lzy;
ll fst, lst;
bool leaf;
} t[N*4];
int sz;
void init(int n) {
sz = n;
t[0].val = {};
t[0].lzy = 0;
t[0].fst = 0;
t[0].lst = 0;
t[0].leaf = 1;
}
void up(int i, ll x) {
t[i].val.second += x;
t[i].lzy += x;
t[i].fst += x;
t[i].lst += x;
}
void ppg(int i, int b, int e) {
if (t[i].leaf) {
t[2*i+1] = t[2*i+2] = t[i];
t[2*i+1].lst = eval(t[2*i+1].val, (b+e)/2-1);
t[2*i+2].fst = eval(t[2*i+2].val, (b+e)/2);
t[i].leaf = 0;
} else {
up(2*i+1, t[i].lzy);
up(2*i+2, t[i].lzy);
}
t[i].lzy = 0;
}
void merge(int i) {
t[i].fst = t[2*i+1].fst;
t[i].lst = t[2*i+2].lst;
}
void add(int l, int r, ll x, int i, int b, int e) {
if (l <= b && e <= r) {
up(i, x);
return;
}
ppg(i, b, e);
if (l < (b+e)/2)
add(l, r, x, 2*i+1, b, (b+e)/2);
if ((b+e)/2 < r)
add(l, r, x, 2*i+2, (b+e)/2, e);
merge(i);
}
void add(int l, int r, ll x) { add(l, r, x, 0, 0, sz); }
void mn(int l, int r, pll f, int i, int b, int e) {
ll fst2 = eval(f, b);
ll lst2 = eval(f, e-1);
if (l <= b && e <= r && t[i].fst >= fst2 && t[i].lst >= lst2) {
t[i].val = f;
t[i].fst = fst2;
t[i].lst = lst2;
t[i].leaf = 1;
return;
}
if (l <= b && e <= r && t[i].lst <= lst2 && t[i].fst <= fst2)
return;
ppg(i, b, e);
if (l < (b+e)/2)
mn(l, r, f, 2*i+1, b, (b+e)/2);
if ((b+e)/2 < r)
mn(l, r, f, 2*i+2, (b+e)/2, e);
merge(i);
}
void mn(int l, int r, pll f) { mn(l, r, f, 0, 0, sz); }
ll get(int p, int i, int b, int e) {
if (t[i].leaf)
return eval(t[i].val, p);
ppg(i, b, e);
if (p < (b+e)/2)
return get(p, 2*i+1, b, (b+e)/2);
else
return get(p, 2*i+2, (b+e)/2, e);
}
ll get(int p) { return get(p, 0, 0, sz); }
}
namespace rmq {
const int lg = 20;
pii mx[lg][N];
void make(vector<int> a) {
int n = a.size();
Loop (i,0,n)
mx[0][i] = {a[i], i};
Loop (i,0,lg-1) {
for (int j = 0; j + (2 << i) <= n; ++j)
mx[i+1][j] = max(mx[i][j], mx[i][j+(1<<i)]);
}
}
pii get(int l, int r) {
int k = __lg(r-l);
return max(mx[k][l], mx[k][r-(1<<k)]);
}
}
ll arr[N];
namespace cart {
pii t[N];
vector<pair<ll *, int>> queryl[N];
vector<pair<ll *, int>> queryr[N];
int rt;
int sz;
void make(int &ans, int l, int r) {
if (l >= r) {
ans = -1;
return;
}
ans = rmq::get(l, r).second;
make(t[ans].first, l, ans);
make(t[ans].second, ans+1, r);
}
void make(int n) { sz = n; make(rt, 0, sz); }
void dfs(int v, int l, int r, void (*merge)(int, int, int)) {
if (v == -1)
return;
dfs(t[v].first, l, v, merge);
dfs(t[v].second, v+1, r, merge);
merge(v, l, r);
}
void mergel(int v, int l, int r) {
seg::add(v, r, (v-l+1)*arr[v]);
if (v != l) {
ll x = seg::get(v-1);
seg::mn(v, r, pll{arr[v], x - (v-1)*arr[v]});
}
for (auto [p, pos] : queryl[v])
*p = seg::get(pos);
}
void merger(int v, int l, int r) {
seg::add(l, v+1, (r-v)*arr[v]);
if (v != r-1) {
ll x = seg::get(v+1);
seg::mn(l, v+1, pll{-arr[v], x + (v+1)*arr[v]});
}
for (auto [p, pos] : queryr[v])
*p = seg::get(pos);
}
void answer() {
seg::init(sz);
dfs(rt, 0, sz, mergel);
seg::init(sz);
dfs(rt, 0, sz, merger);
}
}
ll Ql[N], Qr[N];
std::vector<long long> minimum_costs(std::vector<int> H, std::vector<int> L,
std::vector<int> R) {
int n = H.size();
Loop (i,0,n)
arr[i] = H[i];
rmq::make(H);
cart::make(n);
int q = L.size();
Loop (i,0,q) {
int l = L[i];
int r = R[i]+1;
int v = rmq::get(l, r).second;
if (l < v) {
cart::queryr[cart::t[v].first]
.push_back({&Ql[i], l});
}
if (v < r-1) {
cart::queryl[cart::t[v].second]
.push_back({&Qr[i], r-1});
}
}
cart::answer();
vector<ll> ans(q);
Loop (i,0,q) {
int l = L[i];
int r = R[i]+1;
int v = rmq::get(l, r).second;
ans[i] = arr[v] * (r-l);
if (l < v)
ans[i] = min(ans[i], Ql[i] + arr[v] * (r-v));
if (v < r-1)
ans[i] = min(ans[i], Qr[i] + arr[v] * (v-l+1));
}
return ans;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
85 ms |
235148 KB |
Output is correct |
2 |
Correct |
79 ms |
235584 KB |
Output is correct |
3 |
Correct |
83 ms |
235596 KB |
Output is correct |
4 |
Correct |
96 ms |
235584 KB |
Output is correct |
5 |
Correct |
90 ms |
235524 KB |
Output is correct |
6 |
Correct |
81 ms |
235664 KB |
Output is correct |
7 |
Correct |
85 ms |
235568 KB |
Output is correct |
8 |
Correct |
102 ms |
235720 KB |
Output is correct |
9 |
Correct |
84 ms |
235652 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
85 ms |
235148 KB |
Output is correct |
2 |
Correct |
79 ms |
235584 KB |
Output is correct |
3 |
Correct |
83 ms |
235596 KB |
Output is correct |
4 |
Correct |
96 ms |
235584 KB |
Output is correct |
5 |
Correct |
90 ms |
235524 KB |
Output is correct |
6 |
Correct |
81 ms |
235664 KB |
Output is correct |
7 |
Correct |
85 ms |
235568 KB |
Output is correct |
8 |
Correct |
102 ms |
235720 KB |
Output is correct |
9 |
Correct |
84 ms |
235652 KB |
Output is correct |
10 |
Correct |
108 ms |
236360 KB |
Output is correct |
11 |
Correct |
97 ms |
236340 KB |
Output is correct |
12 |
Correct |
85 ms |
236328 KB |
Output is correct |
13 |
Correct |
85 ms |
236440 KB |
Output is correct |
14 |
Correct |
94 ms |
236548 KB |
Output is correct |
15 |
Correct |
99 ms |
236324 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
76 ms |
235084 KB |
Output is correct |
2 |
Correct |
109 ms |
240848 KB |
Output is correct |
3 |
Correct |
254 ms |
262616 KB |
Output is correct |
4 |
Correct |
237 ms |
260264 KB |
Output is correct |
5 |
Correct |
214 ms |
257384 KB |
Output is correct |
6 |
Correct |
249 ms |
262696 KB |
Output is correct |
7 |
Correct |
266 ms |
263204 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
76 ms |
235084 KB |
Output is correct |
2 |
Correct |
109 ms |
240848 KB |
Output is correct |
3 |
Correct |
254 ms |
262616 KB |
Output is correct |
4 |
Correct |
237 ms |
260264 KB |
Output is correct |
5 |
Correct |
214 ms |
257384 KB |
Output is correct |
6 |
Correct |
249 ms |
262696 KB |
Output is correct |
7 |
Correct |
266 ms |
263204 KB |
Output is correct |
8 |
Correct |
269 ms |
260688 KB |
Output is correct |
9 |
Correct |
257 ms |
260516 KB |
Output is correct |
10 |
Correct |
266 ms |
260880 KB |
Output is correct |
11 |
Correct |
246 ms |
260232 KB |
Output is correct |
12 |
Correct |
237 ms |
259964 KB |
Output is correct |
13 |
Correct |
342 ms |
260984 KB |
Output is correct |
14 |
Correct |
272 ms |
262784 KB |
Output is correct |
15 |
Correct |
230 ms |
259844 KB |
Output is correct |
16 |
Correct |
260 ms |
262312 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
85 ms |
235148 KB |
Output is correct |
2 |
Correct |
79 ms |
235584 KB |
Output is correct |
3 |
Correct |
83 ms |
235596 KB |
Output is correct |
4 |
Correct |
96 ms |
235584 KB |
Output is correct |
5 |
Correct |
90 ms |
235524 KB |
Output is correct |
6 |
Correct |
81 ms |
235664 KB |
Output is correct |
7 |
Correct |
85 ms |
235568 KB |
Output is correct |
8 |
Correct |
102 ms |
235720 KB |
Output is correct |
9 |
Correct |
84 ms |
235652 KB |
Output is correct |
10 |
Correct |
108 ms |
236360 KB |
Output is correct |
11 |
Correct |
97 ms |
236340 KB |
Output is correct |
12 |
Correct |
85 ms |
236328 KB |
Output is correct |
13 |
Correct |
85 ms |
236440 KB |
Output is correct |
14 |
Correct |
94 ms |
236548 KB |
Output is correct |
15 |
Correct |
99 ms |
236324 KB |
Output is correct |
16 |
Correct |
76 ms |
235084 KB |
Output is correct |
17 |
Correct |
109 ms |
240848 KB |
Output is correct |
18 |
Correct |
254 ms |
262616 KB |
Output is correct |
19 |
Correct |
237 ms |
260264 KB |
Output is correct |
20 |
Correct |
214 ms |
257384 KB |
Output is correct |
21 |
Correct |
249 ms |
262696 KB |
Output is correct |
22 |
Correct |
266 ms |
263204 KB |
Output is correct |
23 |
Correct |
269 ms |
260688 KB |
Output is correct |
24 |
Correct |
257 ms |
260516 KB |
Output is correct |
25 |
Correct |
266 ms |
260880 KB |
Output is correct |
26 |
Correct |
246 ms |
260232 KB |
Output is correct |
27 |
Correct |
237 ms |
259964 KB |
Output is correct |
28 |
Correct |
342 ms |
260984 KB |
Output is correct |
29 |
Correct |
272 ms |
262784 KB |
Output is correct |
30 |
Correct |
230 ms |
259844 KB |
Output is correct |
31 |
Correct |
260 ms |
262312 KB |
Output is correct |
32 |
Correct |
1544 ms |
439552 KB |
Output is correct |
33 |
Correct |
1293 ms |
436860 KB |
Output is correct |
34 |
Correct |
1577 ms |
449908 KB |
Output is correct |
35 |
Correct |
1605 ms |
445788 KB |
Output is correct |
36 |
Correct |
1346 ms |
445352 KB |
Output is correct |
37 |
Correct |
1549 ms |
450004 KB |
Output is correct |
38 |
Correct |
1807 ms |
465484 KB |
Output is correct |
39 |
Correct |
1931 ms |
465456 KB |
Output is correct |
40 |
Correct |
1728 ms |
454024 KB |
Output is correct |
41 |
Correct |
2124 ms |
477008 KB |
Output is correct |
42 |
Correct |
2338 ms |
479456 KB |
Output is correct |
43 |
Correct |
2310 ms |
479412 KB |
Output is correct |
44 |
Correct |
2441 ms |
465080 KB |
Output is correct |