#include "meetings.h"
#include<bitset>
#include<compare>
#include<functional>
#include<tuple>
#include<utility>
#include<cstring>
#include<string>
#include<deque>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<unordered_map>
#include<unordered_set>
#include<vector>
#include<iterator>
#include<ranges>
#include<algorithm>
#include<random>
#include<fstream>
#include<iostream>
using namespace std;
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
typedef long long int ll;
typedef long double ld;
#define mp make_pair
#define pb push_back
#define eb emplace_back
vector<pair<ll,ll> > dq, pa;
ll aj[750005][2], l[750005], r[750005], root, h[750005], ans[750005];
struct node{
ll s, e, m, lazy, vm, vc;
node *l, *r;
node(ll _s, ll _e): s(_s), e(_e), m((_s+_e)/2), lazy(0), vm(0), vc(1e17){
if(s!=e){
l = new node(s,m);
r = new node(m+1, e);
}
}
void propo(){
if(lazy){
l->vc += lazy;
r->vc += lazy;
l->lazy += lazy;
r->lazy += lazy;
lazy = 0;
}
}
void update(ll x,ll y, ll nm, ll nc){
if(s==x&&y==e){
if((vm|vc)==0){
vm = nm;
vc = nc;
return;
}
if(nm*m+nc < vm*m+vc){
swap(nm, vm);
swap(vc, nc);
}
if(s!=e){
propo();
if(vm > nm)r->update(m+1, e, nm, nc);
if(vm < nm)l->update(s, m, nm, nc);
}
return;
}
propo();
if(y<=m)l->update(x, y, nm, nc);
else if(x>m)r->update(x, y, nm, nc);
else{
l->update(x, m, nm, nc);
r->update(m+1, y, nm, nc);
}
}
void add(ll x,ll y, ll v){
if(s==x&&e==y){
lazy+=v;
vc+=v;
return;
}
propo();
if(y<=m)l->add(x, y, v);
else if(x>m)r->add(x, y, v);
else{
l->add(x, m, v);
r->add(m+1, y, v);
}
}
ll query(ll x){
ll a = 1e17;
if(vm | vc){
a = vm*x+vc;
}
if(s==e)return a;
propo();
if(x<=m)return min(a, l->query(x));
else return min(a, r->query(x));
}
} *rootS, *rootP;
vector<tuple<ll,ll, ll> > v, qn[750005];
vector<pair<ll,ll> > dq2;
void dfs(ll x){
ll a = 0, b = 0;
if(~aj[x][0]){
dfs(aj[x][0]);
a = rootP->query(x-1);
}
if(~aj[x][1]){
dfs(aj[x][1]);
b = rootS->query(x+1);
}
//cout<<x<<" "<<l[x]<<" "<<r[x]<<" "<<a<<" "<<b<<" val"<<endl;
for(auto [ql, qr, q]:qn[x]){
// cout<<ql<<" "<<qr<<" "<<q<<endl;
// cout<<((qr>x)?rootP->query(qr):0)<<" "<<((ql<x)? rootS->query(ql):0)<<" "<<h[x]<<endl;
ans[q] = min(((qr>x)?rootP->query(qr):0) + (x-ql+1)*h[x],((ql<x)? rootS->query(ql):0)+(qr-x+1)*h[x]);
}
// cout<<x<<" "<<l[x]<<" "<<r[x]<<" "<<a<<" "<<b<<" dfs"<<endl;
rootS->update(x, x, 0, 0);
rootP->update(x, x, 0, 0);
rootS->add(l[x], x, (r[x] - x+1)*h[x]);
if(x>l[x])rootS->add(x, x, (x-l[x])*h[x]);
rootP->add(x, r[x], (x - l[x]+1)*h[x]);
if(r[x]>x)rootP->add(x, x, (r[x] - x)*h[x]);
rootS->update(l[x], x, -h[x], b+(x+1)*h[x]);
rootP->update(x, r[x], h[x], a+(1-x)*h[x]);
//cout<<x<<" "<<l[x]<<" "<<r[x]<<" "<<rootP->query(r[x])<<" "<<rootS->query(l[x])<<" dfs"<<endl;
// for(ll i=0;i<5;i++)cout<<rootP->query(i)<<" ";cout<<"\n";
// for(ll i=0;i<5;i++)cout<<rootS->query(i)<<" ";cout<<"\n";
}
vector<long long> minimum_costs(vector<int> H, vector<int> L,
vector<int> R) {
int Q = L.size();
vector<long long> C(Q);
int n = H.size();
ll i,j,k,a,b,c,x,y,z;
memset(aj, -1, sizeof(aj));
for(i=0;i<Q;i++){
v.eb(R[i], L[i], i);
}
sort(all(v));
ll cur = 0;
for(i=0;i<n;i++){
h[i] = H[i];
pa.eb(2e9, -1);
auto it = mp((ll)H[i], i);
while(dq.size()&&dq.back() <= it)dq.pop_back();
if(dq.size()){
pa[i] = dq.back();
l[i] = dq.back().second+1;
}else l[i] = 0;
dq.pb(it);
while(dq2.size()&&dq2.back().second<=h[i])dq2.pop_back();
dq2.pb(mp(i, h[i]));
while(cur<Q&&get<0>(v[cur])==i){
a = lower_bound(dq2.begin(), dq2.end(), mp(get<1>(v[cur]), -1ll)) - dq2.begin();
qn[dq2[a].first].eb(get<1>(v[cur]), get<0>(v[cur]), get<2>(v[cur]));
cur++;
}
}
dq.clear();
for(i=n-1;i>=0;i--){
auto it = mp((ll)H[i], i);
while(dq.size()&&dq.back() <= it)dq.pop_back();
if(dq.size()){
pa[i] = min(dq.back(), pa[i]);
r[i] = dq.back().second-1;
}else r[i] = n-1;
dq.pb(it);
}
for(i=0;i<n;i++){
if(pa[i].second==-1)root = i;
else{
aj[pa[i].second][pa[i].second < i] = i;
}
}
rootP = new node(0, n-1);
rootS = new node(0, n-1);
dfs(root);
for(i=0;i<Q;i++)C[i] = ans[i];
return C;
}
Compilation message
meetings.cpp: In function 'void dfs(ll)':
meetings.cpp:117:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
117 | for(auto [ql, qr, q]:qn[x]){
| ^
meetings.cpp: In function 'std::vector<long long int> minimum_costs(std::vector<int>, std::vector<int>, std::vector<int>)':
meetings.cpp:140:8: warning: unused variable 'j' [-Wunused-variable]
140 | ll i,j,k,a,b,c,x,y,z;
| ^
meetings.cpp:140:10: warning: unused variable 'k' [-Wunused-variable]
140 | ll i,j,k,a,b,c,x,y,z;
| ^
meetings.cpp:140:14: warning: unused variable 'b' [-Wunused-variable]
140 | ll i,j,k,a,b,c,x,y,z;
| ^
meetings.cpp:140:16: warning: unused variable 'c' [-Wunused-variable]
140 | ll i,j,k,a,b,c,x,y,z;
| ^
meetings.cpp:140:18: warning: unused variable 'x' [-Wunused-variable]
140 | ll i,j,k,a,b,c,x,y,z;
| ^
meetings.cpp:140:20: warning: unused variable 'y' [-Wunused-variable]
140 | ll i,j,k,a,b,c,x,y,z;
| ^
meetings.cpp:140:22: warning: unused variable 'z' [-Wunused-variable]
140 | ll i,j,k,a,b,c,x,y,z;
| ^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
14 ms |
29652 KB |
Output is correct |
2 |
Correct |
17 ms |
30776 KB |
Output is correct |
3 |
Correct |
19 ms |
30676 KB |
Output is correct |
4 |
Correct |
18 ms |
30760 KB |
Output is correct |
5 |
Correct |
18 ms |
30804 KB |
Output is correct |
6 |
Correct |
18 ms |
31020 KB |
Output is correct |
7 |
Correct |
18 ms |
30676 KB |
Output is correct |
8 |
Correct |
18 ms |
31024 KB |
Output is correct |
9 |
Correct |
19 ms |
30984 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
14 ms |
29652 KB |
Output is correct |
2 |
Correct |
17 ms |
30776 KB |
Output is correct |
3 |
Correct |
19 ms |
30676 KB |
Output is correct |
4 |
Correct |
18 ms |
30760 KB |
Output is correct |
5 |
Correct |
18 ms |
30804 KB |
Output is correct |
6 |
Correct |
18 ms |
31020 KB |
Output is correct |
7 |
Correct |
18 ms |
30676 KB |
Output is correct |
8 |
Correct |
18 ms |
31024 KB |
Output is correct |
9 |
Correct |
19 ms |
30984 KB |
Output is correct |
10 |
Correct |
28 ms |
32012 KB |
Output is correct |
11 |
Correct |
22 ms |
31968 KB |
Output is correct |
12 |
Correct |
24 ms |
32100 KB |
Output is correct |
13 |
Correct |
23 ms |
32024 KB |
Output is correct |
14 |
Correct |
24 ms |
32404 KB |
Output is correct |
15 |
Correct |
22 ms |
32072 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
29652 KB |
Output is correct |
2 |
Correct |
58 ms |
37580 KB |
Output is correct |
3 |
Correct |
225 ms |
83480 KB |
Output is correct |
4 |
Correct |
236 ms |
76396 KB |
Output is correct |
5 |
Correct |
180 ms |
83308 KB |
Output is correct |
6 |
Correct |
184 ms |
84284 KB |
Output is correct |
7 |
Correct |
207 ms |
86792 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
29652 KB |
Output is correct |
2 |
Correct |
58 ms |
37580 KB |
Output is correct |
3 |
Correct |
225 ms |
83480 KB |
Output is correct |
4 |
Correct |
236 ms |
76396 KB |
Output is correct |
5 |
Correct |
180 ms |
83308 KB |
Output is correct |
6 |
Correct |
184 ms |
84284 KB |
Output is correct |
7 |
Correct |
207 ms |
86792 KB |
Output is correct |
8 |
Correct |
218 ms |
77292 KB |
Output is correct |
9 |
Correct |
176 ms |
76940 KB |
Output is correct |
10 |
Correct |
186 ms |
77296 KB |
Output is correct |
11 |
Correct |
216 ms |
76472 KB |
Output is correct |
12 |
Correct |
180 ms |
75648 KB |
Output is correct |
13 |
Correct |
183 ms |
76800 KB |
Output is correct |
14 |
Correct |
221 ms |
83516 KB |
Output is correct |
15 |
Correct |
213 ms |
75952 KB |
Output is correct |
16 |
Correct |
248 ms |
83720 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
14 ms |
29652 KB |
Output is correct |
2 |
Correct |
17 ms |
30776 KB |
Output is correct |
3 |
Correct |
19 ms |
30676 KB |
Output is correct |
4 |
Correct |
18 ms |
30760 KB |
Output is correct |
5 |
Correct |
18 ms |
30804 KB |
Output is correct |
6 |
Correct |
18 ms |
31020 KB |
Output is correct |
7 |
Correct |
18 ms |
30676 KB |
Output is correct |
8 |
Correct |
18 ms |
31024 KB |
Output is correct |
9 |
Correct |
19 ms |
30984 KB |
Output is correct |
10 |
Correct |
28 ms |
32012 KB |
Output is correct |
11 |
Correct |
22 ms |
31968 KB |
Output is correct |
12 |
Correct |
24 ms |
32100 KB |
Output is correct |
13 |
Correct |
23 ms |
32024 KB |
Output is correct |
14 |
Correct |
24 ms |
32404 KB |
Output is correct |
15 |
Correct |
22 ms |
32072 KB |
Output is correct |
16 |
Correct |
15 ms |
29652 KB |
Output is correct |
17 |
Correct |
58 ms |
37580 KB |
Output is correct |
18 |
Correct |
225 ms |
83480 KB |
Output is correct |
19 |
Correct |
236 ms |
76396 KB |
Output is correct |
20 |
Correct |
180 ms |
83308 KB |
Output is correct |
21 |
Correct |
184 ms |
84284 KB |
Output is correct |
22 |
Correct |
207 ms |
86792 KB |
Output is correct |
23 |
Correct |
218 ms |
77292 KB |
Output is correct |
24 |
Correct |
176 ms |
76940 KB |
Output is correct |
25 |
Correct |
186 ms |
77296 KB |
Output is correct |
26 |
Correct |
216 ms |
76472 KB |
Output is correct |
27 |
Correct |
180 ms |
75648 KB |
Output is correct |
28 |
Correct |
183 ms |
76800 KB |
Output is correct |
29 |
Correct |
221 ms |
83516 KB |
Output is correct |
30 |
Correct |
213 ms |
75952 KB |
Output is correct |
31 |
Correct |
248 ms |
83720 KB |
Output is correct |
32 |
Correct |
1736 ms |
383308 KB |
Output is correct |
33 |
Correct |
1377 ms |
380384 KB |
Output is correct |
34 |
Correct |
1360 ms |
386896 KB |
Output is correct |
35 |
Correct |
1841 ms |
386404 KB |
Output is correct |
36 |
Correct |
1322 ms |
383236 KB |
Output is correct |
37 |
Correct |
1426 ms |
387344 KB |
Output is correct |
38 |
Correct |
1887 ms |
440368 KB |
Output is correct |
39 |
Correct |
1909 ms |
440332 KB |
Output is correct |
40 |
Correct |
2048 ms |
394456 KB |
Output is correct |
41 |
Correct |
3165 ms |
490036 KB |
Output is correct |
42 |
Correct |
3692 ms |
494408 KB |
Output is correct |
43 |
Correct |
3611 ms |
494348 KB |
Output is correct |
44 |
Correct |
3008 ms |
440892 KB |
Output is correct |