제출 #1240000

#제출 시각아이디문제언어결과실행 시간메모리
1240000yenthuyaBuilding Bridges (CEOI17_building)C++20
0 / 100
3095 ms4076 KiB
#include <iostream>
#include <vector>
#include <map>
#include <climits>
using namespace std;

typedef long long ll;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n;
    cin >> n;
    
    vector<ll> h(n), w(n), prefix(n + 1, 0), dp(n, LLONG_MAX);

    for (int i = 0; i < n; ++i)
        cin >> h[i];
    for (int i = 0; i < n; ++i) {
        cin >> w[i];
        prefix[i + 1] = prefix[i] + w[i];
    }

    dp[0] = 0;

    // TreeMap for height -> dp value (optimized step)
    map<ll, ll> min_dp_for_height;
    min_dp_for_height[h[0]] = 0;

    for (int i = 1; i < n; ++i) {
        for (auto& [hj, dpj] : min_dp_for_height) {
            // Tính chi phí khi chọn trụ j để nối đến i
            ll cost = dpj + (h[i] - hj) * (h[i] - hj) + prefix[i] - prefix[&hj - &h[0] + 1];
            dp[i] = min(dp[i], cost);
        }

        // Cập nhật bản đồ chi phí tối ưu với h[i]
        if (!min_dp_for_height.count(h[i])) {
            min_dp_for_height[h[i]] = dp[i];
        } else {
            min_dp_for_height[h[i]] = min(min_dp_for_height[h[i]], dp[i]);
        }
    }

    cout << dp[n - 1] << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...