#include "meetings.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> ST;
vector<int> h;
int N,n;
vector<vector<ll>> dp;
int L(int i) {return 2*i;}
int R(int i) {return 2*i + 1;}
ll query(int i, int l, int r, int a, int b) {
if(l > r || r < a || l > b) return 0LL;
if(a <= l && r <= b) {
return ST[i];
}
int m = (l+r)/2;
return max(query(L(i), l, m, a, b), query(R(i), m+1, r, a, b));
}
ll ask(int l, int r) {
return query(1, 0, N-1, l, r);
}
void build(int i, int l, int r) {
if(l == r) {
ST[i] = h[l];
return;
}
int m = (l+r)/2;
build(L(i), l, m);
build(R(i), m+1, r);
ST[i] = max(ST[L(i)], ST[R(i)]);
}
ll answer(int x, int i) {
if(x == i) return h[x];
if(dp[x][i] != -1) return dp[x][i];
else if(x > i) {
dp[x][i] = answer(x, i+1) + ask(i, x);
} else {
dp[x][i] = answer(x, i-1) + ask(x, i);
}
return dp[x][i];
}
vector<ll> minimum_costs(vector<int> H, vector<int> L, vector<int> R) {
h = H;
N = n = H.size();
dp = vector<vector<ll>>(N+1, vector<ll>(N+1, -1));
ST.resize(4*n);
build(1, 0, N-1);
int Q = L.size();
vector<ll> ans(Q);
for(int i = 0; i < Q; i++) {
int l = L[i]; int r = R[i];
ll best = numeric_limits<ll>::max();
for(int k = l; k <= r; k++) {
best = min(best, answer(k, l) + answer(k, r) - h[k]);
}
ans[i] = best;
}
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |