# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
418373 | JediMaster11 | Meetings (IOI18_meetings) | C++17 | 0 ms | 0 KiB |
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>
using namespace std;
#define fo(a, b, c) for (int a = b; a < c; a++)
#define ll long long
#define print(x) cout << x << "\n";
#define vint vector<int>
#define vll vector<long long>
int maxx[750000][750000];
// void compute(vint h){
// int maxHelp=-1;
// fo(i, 0, h.size()){
// }
// }
ll recur(int l, int r, vint h)
{ // r is non-inclsuive
if (r - l == 1)
{
return h[l];
}else if(r==l){
return 0;
}
if(maxx[l][r]!=0){
return maxx[l][r];
}
int maxH = -1;
fo(i, l, r)
{
maxH = max(maxH, h[i]);
}
vector<pair<pair<int, int>, ll>> aves;
// stores the left and right, and then the sum of the middle
int leftH = l;
fo(i, l, r)
{
if (h[i] == maxH)
{
if (i == l || h[i] != h[i - 1])
{
ll tmp = recur(leftH, i, h);
aves.push_back({{leftH, i}, tmp});
}
leftH = i + 1;
}
}
if (leftH != r)
{
ll tmp = recur(leftH, r, h);
aves.push_back({{leftH, r}, tmp});
}
// int index=-1;
ll smallest = maxH * (r - l) + 1;
fo(i, 0, aves.size())
{
ll maxtmp = 0ll + aves[i].second + maxH * ((r - aves[i].first.second) + (aves[i].first.first - l));
if (maxtmp < smallest)
{
smallest = maxtmp;
}
}
maxx[l][r]=smallest;
return smallest;
}
// h - heights
// l, r - left and right bounds of each meeting
vll minCosts;
vll minimum_costs(vint h, vint l, vint r)
{
int numMeetings = l.size();
// compute(h);
minCosts.reserve(numMeetings);
fo(i, 0, (int)numMeetings)
{
minCosts.push_back(recur(l[i], r[i] + 1, h));
}
return minCosts;
}
// int main()
// {
// ios::sync_with_stdio(0);
// cin.tie(0);
// // vint h = {2, 5, 1, 6, 8, 1, 4};
// // vint l = {0};
// // vint r = {6};
// vint h = {2, 4, 3, 5};
// vint l = {0, 1, 0};
// vint r = {2, 3, 3};
// vll tmp = minimum_costs(h, l, r);
// fo(i, 0, tmp.size())
// {
// print(tmp[i]);
// }
// }