Submission #763993

#TimeUsernameProblemLanguageResultExecution timeMemory
763993t6twotwoMeetings (IOI18_meetings)C++17
19 / 100
494 ms786432 KiB
#include "meetings.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
constexpr ll inf = 1e18;
vector<ll> minimum_costs(vector<int> H, vector<int> L, vector<int> R) {
    int N = H.size(), Q = L.size();
    if (N <= 5000 && Q <= 5000) {
        vector<ll> ans(Q, inf);
        for (int i = 0; i < Q; i++) {
            vector<int> stk;
            vector<ll> A(N);
            for (int j = L[i]; j <= R[i]; j++) {
                while (!stk.empty() && H[stk.back()] <= H[j]) {
                    stk.pop_back();
                }
                if (stk.empty()) {
                    A[j] = 1LL * H[j] * (j - (L[i] - 1));
                } else {
                    A[j] = 1LL * H[j] * (j - stk.back()) + A[stk.back()];
                }
                stk.push_back(j);
            }
            stk.clear();
            vector<ll> B(N);
            for (int j = R[i]; j >= L[i]; j--) {
                while (!stk.empty() && H[stk.back()] <= H[j]) {
                    stk.pop_back();
                }
                if (stk.empty()) {
                    B[j] = 1LL * H[j] * ((R[i] + 1) - j);
                } else {
                    B[j] = 1LL * H[j] * (stk.back() - j) + B[stk.back()];
                }
                stk.push_back(j);
            }
            for (int j = L[i]; j <= R[i]; j++) {
                ans[i] = min(ans[i], A[j] + B[j] - H[j]);
            }
        }
        return ans;
    }
    vector<int> L2(N);
    for (int i = 0; i < N; i++) {
        L2[i] = H[i] == 2 ? i : i == 0 ? -1 : L2[i - 1];
    }
    vector<int> R2(N);
    for (int i = N - 1; i >= 0; i--) {
        R2[i] = H[i] == 2 ? i : i == N - 1 ? N : R2[i + 1];
    }
    vector mx(N, vector<int>(N));
    for (int i = 0; i < N; i++) {
        for (int j = i, k = -1; j < N; j++) {
            if (j > i) {
                mx[i][j] = mx[i][j - 1];
            }
            if (H[j] == 2) {
                if (k != -1) {
                    mx[i][j] = max(mx[i][j], j - k);
                }
                k = j;
            }
        }
    }
    vector<ll> ans(Q);
    for (int i = 0; i < Q; i++) {
        int T = R[i] - L[i] + 1;
        if (R2[L[i]] > R[i]) {
            ans[i] = T;
            continue;
        }
        ans[i] = 2 * T;
        ans[i] = min(ans[i], 2ll * T - R2[L[i]] + L[i]);
        ans[i] = min(ans[i], 2ll * T - R[i] + L2[R[i]]);
        ans[i] = min(ans[i], 2ll * T - mx[L[i]][R[i]] + 1);
    }
    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...