Submission #1199020

#TimeUsernameProblemLanguageResultExecution timeMemory
1199020ach00Meetings (IOI18_meetings)C++20
19 / 100
5573 ms505236 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...