This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#include "meetings.h"
using namespace std;
typedef long long ll;
const int N = 1e6;
int n, q, a[N];
ll solve(int l, int r) {
vector<ll> dp(n + 1, 0);
vector<int> q(r - l + 3, -1);
int idx = 0;
ll sum = 0;
q[++idx] = l - 1;
for(int i = l; i <= r; ++i) {
while(idx > 1 && a[i] >= a[q[idx]]) {
sum -= (ll) (q[idx] - q[idx - 1]) * a[q[idx]];
--idx;
}
q[++idx] = i;
sum += (ll) (q[idx] - q[idx - 1]) * a[q[idx]];
dp[i] = sum;
}
idx = sum = 0;
q[++idx] = r + 1;
for(int i = r; i >= l; --i) {
while(idx > 1 && a[i] >= a[q[idx]]) {
sum -= (ll) (q[idx - 1] - q[idx]) * a[q[idx]];
--idx;
}
q[++idx] = i;
sum += (ll) (q[idx - 1] - q[idx]) * a[q[idx]];
dp[i] += sum;
}
ll ans = 1e18;
for(int i = l; i <= r; ++i) {
ans = min(ans, dp[i] - a[i]);
}
return ans;
}
vector<ll> minimum_costs(vector<int> H, vector<int> L, vector<int> R) {
n = H.size(), q = L.size();
copy(H.begin(), H.end(), a + 1);
vector<ll> ret(q);
for(int i = 0; i < q; ++i) {
ret[i] = solve(++L[i], ++R[i]);
}
return ret;
}
# | 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... |