Cod sursa(job #2431453)

Utilizator MohamedAhmed04Mohamed Ahmed Ali Mohamed Bakry MohamedAhmed04 Data 19 iunie 2019 15:52:20
Problema Ghiozdan Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <bits/stdc++.h>

using namespace std;

const int MXW = 75005;
long long dp1[2][MXW], dp2[2][MXW];
const long long scale = 2e4 + 1;
int w[scale];

long long *solve(long long dp[2][MXW], int s, int e, int rem) {
    memset(dp[!(s & 1)], 0, (rem + 1) * sizeof(dp[0][0]));
    for (int i = s; i <= e; ++i) {
        for (int r = 1; r <= rem; ++r) {
            long long &res = dp[i & 1][r];
            int id = !(i & 1);
            res = dp[id][r];
            if (w[i] <= r) res = max(res, dp[id][r - w[i]] + scale * w[i] - 1);
        }
    }
    return dp[e & 1];
}

void hirschberg(int s, int e, int rem) {
    if (s == e) {
        if (w[s] <= rem) printf("%d\n", w[s]);
        return;
    }
    if (e < s || rem == 0) return;
    int mid = (s + e) / 2;
    long long *d1 = solve(dp1, s, mid, rem);
    long long *d2 = solve(dp2, mid + 1, e, rem);
    long long best = 0;
    int bestr;
    for (int r = 0; r <= rem; ++r) {
        long long v = d1[r] + d2[rem - r];
        if (v > best) {
            best = v;
            bestr = r;
        }
    }
    hirschberg(s, mid, bestr);
    hirschberg(mid + 1, e, rem - bestr);
}

int main() {
    freopen("ghiozdan.in", "r", stdin);
    freopen("ghiozdan.out" , "w" , stdout) ;
    int n, k;
    scanf("%d %d", &n, &k);
    for (int i = 0; i < n; ++i) scanf("%d", w + i);
    long long v = solve(dp1, 0, n - 1, k)[k];
    printf("%lld %lld\n", v / scale + 1, -(v % scale - scale));
    hirschberg(0, n - 1, k);
}