제출 #1253491

#제출 시각아이디문제언어결과실행 시간메모리
1253491antonnShortcut (IOI16_shortcut)C++20
23 / 100
104 ms580 KiB
#include "shortcut.h"
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

template<typename T>
bool assign_min(T& a, T b) {
    if (a > b) {
        a = b;
        return true;
    }
    return false;
}

template<typename T>
bool assign_max(T& a, T b) {
    if (a < b) {
        a = b;
        return true;
    }
    return false;
}

/*
6 4
18 1 19 8 12
3 3 17 13 9 7
*/

vector<ll> sum;

ll get_sum(int l, int r) {
    return sum[r] - (l == 0 ? 0 : sum[l - 1]);
}

ll solve(vector<ll> cycle, vector<ll> cost, bool print = 0) {
    ll sum = 0;
    for (auto x : cycle) {
        sum += x;
    }
    /*
    ll ans = 0;
    for (int i = 0; i < cost.size(); i++) {
        ll c = 0;
        for (int j = i + 1; j < cost.size(); j++) {
            c += cycle[j - 1];
            ans = max(ans, cost[i] + cost[j] + min(c, sum - c));
        }
    }
    return ans;
    */
    vector<ll> pref(cycle.size());
    pref[0] = cycle[0];
    for (int i = 1; i < cycle.size(); i++) {
        pref[i] = pref[i - 1] + cycle[i];
    }
    vector<ll> suff(cycle.size() + 1, -1e18);
    for (int i = cycle.size() - 1; i >= 1; i--) {
        suff[i] = max(suff[i + 1], cost[i] - pref[i - 1]);
    }
    int j = 1;
    deque<pair<int, ll>> dq;
    ll ans = 0;
    for (int i = 0; i < cycle.size(); i++) {
        while (!dq.empty() && dq.front().first <= i) {
            dq.pop_front();
        }
        while (j < cycle.size() && (pref[j - 1] - (i == 0 ? 0 : pref[i - 1])) * 2 <= sum) {
            ll val = pref[j - 1] + cost[j];
            /*
            if (print) {
                cout << "BAG IN DEQUE " << j << ": " << val << "\n";
            }
            */
            while (!dq.empty() && val >= dq.back().second) {
                dq.pop_back();
            }
            dq.push_back({j, val});
            j++;
        }
        if (!dq.empty()) {
            /*
            if (print) {
                cout << i << ": " << j << "\n";
                cout << i << ": " << dq.front().second + cost[i] - (i == 0 ? 0 : pref[i - 1]) << "\n";
            }
            */
            ans = max(ans, dq.front().second + cost[i] - (i == 0 ? 0 : pref[i - 1]));
        }
        if (j < cycle.size()) {
            ans = max(ans, sum + suff[j] + (i == 0 ? 0 : pref[i - 1]) + cost[i]);
        }
    }
    return ans;
}

ll find_shortcut(int n, vector<int> l, vector<int> d, int c) {
    sum.resize(n + 1);
    for (int i = 0; i < n - 1; i++) {
        sum[i] = (i == 0 ? 0 : sum[i - 1]) + l[i];
    }
    vector<ll> far_left(n + 2);
    vector<ll> far_right(n + 2);
    far_left[1] = d[0];
    for (int i = 2; i <= n; i++) {
        far_left[i] = max(far_left[i - 1] + l[i - 2], (ll) d[i - 1]);
    }
    far_right[n] = d[n - 1];
    for (int i = n - 1; i >= 1; i--) {
        far_right[i] = max(far_right[i + 1] + l[i - 1], (ll) d[i - 1]);
    }
    vector<ll> pref(n + 2), suff(n + 2);
    pref[1] = d[0];
    ll far = d[0];
    for (int i = 2; i <= n; i++) {
        pref[i] = max(pref[i - 1], l[i - 2] + far + d[i - 1]);
        far = max(far, far + l[i - 2]);
        far = max(far, (ll) d[i - 1]);
    }
    suff[n] = d[n - 1];
    far = d[n - 1];
    for (int i = n - 1; i >= 1; i--) {
        suff[i] = max(suff[i + 1], l[i - 1] + far + d[i - 1]);
        far = max(far, far + l[i - 1]);
        far = max(far, (ll) d[i - 1]);
    }
    ll ans = pref[n];
    for (int i = 1; i <= n; i++) {
        ll sum = 0;
        for (int j = i + 1; j <= n; j++) {
            vector<ll> cycle, cost;
            for (int k = i + 1; k <= j; k++) {
                cycle.push_back(l[k - 2]);
            }
            for (int k = i; k <= j; k++) {
                cost.push_back(d[k - 1]);
            }
            cycle.push_back(c);
            /*
            if (i == 2 && j == 5) {
                cout << "AICI\n";
                for (auto x : cycle) {
                    cout << x << " ";
                }
                cout << "\n";
                for (auto x : cost) {
                    cout << x << " ";
                }
                cout << "\n";
                cout << " => " << solve(cycle, cost, 1) << "\n";
            }
            */
            ll inside = solve(cycle, cost);
            ll diam = 0;
            diam = max(pref[i], suff[j]);
            diam = max(diam, inside);
            diam = max(diam, far_left[i] + c + far_right[j]);
            for (int k = i + 1; k <= j - 1; k++) {
                diam = max(diam, far_right[j] + d[k - 1] + min(get_sum(k - 1, j - 2), get_sum(i - 1, k - 2) + c));
                diam = max(diam, far_left[i] + d[k - 1] + min(get_sum(k - 1, j - 2) + c, get_sum(i - 1, k - 2)));
            }
            ans = min(ans, diam);
        }
    }
    return ans;
}

컴파일 시 표준 에러 (stderr) 메시지

shortcut.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
shortcut_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...