Submission #1228720

#TimeUsernameProblemLanguageResultExecution timeMemory
1228720omarpaladines95Nile (IOI24_nile)C++20
67 / 100
2095 ms6200 KiB
#include <bits/stdc++.h>

using namespace std;

vector<long long> calculate_costs(
    vector<int> W, vector<int> A,
    vector<int> B, vector<int> E) {

    int N = W.size();
    int Q = E.size();
    
    vector<tuple<int, int, int>> artifacts(N);
    for (int i = 0; i < N; ++i) {
        artifacts[i] = make_tuple(W[i], A[i], B[i]);
    }

    // Sort artifacts by weight ascending first
    sort(artifacts.begin(), artifacts.end());
    
    // Results for each D in E
    vector<long long> results(Q);

    for (int q = 0; q < Q; ++q) {
        int D = E[q];

        // DP[i] stores the minimum cost for sending items from 0 to i.
        vector<long long> dp(N, LLONG_MAX - 1);
        dp[0] = get<1>(artifacts[0]); // Base case: Send 0 on its own.

        for (int i = 1; i < N; ++i) {
            // Case 1: send artifact i alone
            dp[i] = get<1>(artifacts[i]) + dp[i-1];

            // Case 2: try to pair i with i-1
            if (get<0>(artifacts[i]) - get<0>(artifacts[i-1]) <= D)
            {
                long long costLeft = i-2 >= 0 ? dp[i-2] : 0;
                long long costFromPairingWithNextOne = get<2>(artifacts[i]) + get<2>(artifacts[i-1]) + costLeft;

                dp[i] = min(dp[i], costFromPairingWithNextOne);
            }

            // Case 3: Try to pair i with i-2
            if ((get<0>(artifacts[i]) - get<0>(artifacts[i-2]) <= D) && (i-2 >= 0))
            {
                long long costLeftFromIMinus3 = (i-3 >= 0) ? dp[i-3] : 0;
                long long BCostI =  get<2>(artifacts[i]);
                long long ACostI1 = get<1>(artifacts[i-1]);
                long long BCostI2 = get<2>(artifacts[i-2]);
                long long costFromPairingWithIMinus2 = BCostI + ACostI1 + BCostI2 + costLeftFromIMinus3;
                dp[i] = min(dp[i], costFromPairingWithIMinus2);
            }
        }

        results[q] = dp[N-1];
    }

    return 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...
#Verdict Execution timeMemoryGrader output
Fetching results...