Submission #1208812

#TimeUsernameProblemLanguageResultExecution timeMemory
1208812anonymous321Tricks of the Trade (CEOI23_trade)C++20
0 / 100
93 ms13216 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = numeric_limits<ll>::max()/4;

int main() {
    int n, k;
    cin >> n >> k;
    vector<ll> vc (n);
    for (int i = 0; i < n; i++) {
        cin >> vc[i];
    }
    vector<ll> vs (n);
    for (int i = 0; i < n; i++) {
        cin >> vs[i];
    }
    
    vector<ll> p (n+1, 0);
    for (int i = 0; i < n; i++) {
        p[i+1] = p[i] - vc[i];
    }
    
    vector<vector<ll>> dp (k, vector<ll> (n, -INF));
    vector<vector<int>> dp_p (k, vector<int> (n, -1));
    for (int i = 0; i < n; i++) {
        dp[0][i] = vs[i] - vc[i];
    }
    for (int i = 1; i < k; i++) {
        ll mval = -INF;
        int mid = -1;
        for (int j = 0; j < n; j++) {
            dp[i][j] = mval + p[j+1] + vs[j];
            dp_p[i][j] = mid;
            ll x = dp[i - 1][j] - p[j+1];
            if (mval < x) {
                mval = x;
                mid = j;
            }
        }
    }
    
    vector<bool> sol (n-1, false);
    sol[n-1] = true;
    int cur = n-1;
    int curk = k-1;
    while (dp_p[curk][cur] != -1) {
        cur = dp_p[curk][cur];
        curk--;
        sol[cur]= true;
    }
    cout << dp[k-1][n-1] << "\n";
    for (int i = 0; i < n; i++) {
        if (sol[i]) cout << 1;
        else cout << 0;
    }
    cout << "\n";
    return 0;
}
#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...