Submission #1329403

#TimeUsernameProblemLanguageResultExecution timeMemory
1329403jochisFeast (NOI19_feast)C++20
22 / 100
55 ms35548 KiB
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int N, K;
    if (!(cin >> N >> K)) return 0;
    
    vector<long long> A(N);
    for (int i = 0; i < N; i++) cin >> A[i];
    
    // ===== Subtask 1: Todos Ai >= 0 =====
    bool todosPositivos = true;
    for (int i = 0; i < N; i++) {
        if (A[i] < 0) {
            todosPositivos = false;
            break;
        }
    }
    if (todosPositivos) {
        long long suma = 0;
        for (int i = 0; i < N; i++) suma += A[i];
        cout << suma << "\n";
        return 0;
    }
    
    // ===== Subtask 2: Maximo un Ai < 0 =====
    int negativos = 0;
    int posNeg = -1;
    for (int i = 0; i < N; i++) {
        if (A[i] < 0) {
            negativos++;
            posNeg = i;
        }
    }
    
    if (negativos == 0) {
        // Ya cubierto por subtask 1
        long long suma = 0;
        for (int i = 0; i < N; i++) suma += A[i];
        cout << suma << "\n";
        return 0;
    }
    
    if (negativos == 1) {
        // Calcular suma izquierda y derecha
        long long sumaIzq = 0, sumaDer = 0, sumaTotal = 0;
        for (int i = 0; i < N; i++) {
            sumaTotal += A[i];
            if (i < posNeg) sumaIzq += A[i];
            if (i > posNeg) sumaDer += A[i];
        }
        long long ans = max({sumaIzq, sumaDer, sumaTotal});
        cout << ans << "\n";
        return 0;
    }
    
    // ===== Subtask 3 a 6: DP O(NK) =====
    // g[n][k] = max sum with k subarrays, ending at position n (n is chosen)
    // f[n][k] = max sum with k subarrays in first n elements
    
    // Inicializar con valores muy negativos
    const long long NEG_INF = LLONG_MIN / 4;
    
    // f[i][k] = mejor resultado usando los primeros i elementos (0..i-1) con k subarrays
    // g[i][k] = mejor resultado donde el elemento i-1 es seleccionado y pertenece al último subarray
    
    vector<vector<long long>> f(N + 1, vector<long long>(K + 1, NEG_INF));
    vector<vector<long long>> g(N + 1, vector<long long>(K + 1, NEG_INF));
    
    // Casos base
    f[0][0] = 0;  // Sin elementos, sin subarrays = 0
    
    for (int i = 1; i <= N; i++) {
        for (int k = 1; k <= K; k++) {
            // g[i][k]: el elemento i-1 es seleccionado
            // Opción 1: extender el último subarray (g[i-1][k] + A[i-1])
            // Opción 2: iniciar nuevo subarray en i-1 (f[i-1][k-1] + A[i-1])
            long long opt1 = (g[i-1][k] != NEG_INF) ? g[i-1][k] + A[i-1] : NEG_INF;
            long long opt2 = (f[i-1][k-1] != NEG_INF) ? f[i-1][k-1] + A[i-1] : NEG_INF;
            g[i][k] = max(opt1, opt2);
            
            // f[i][k]: no tomar i-1 o tomarlo (como parte de g[i][k])
            f[i][k] = max(f[i-1][k], g[i][k]);
        }
        // Para k = 0, solo podemos no tomar nada
        f[i][0] = 0;
    }
    
    cout << f[N][K] << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...