Cod sursa(job #2511571)

Utilizator CristyXtremeSimion Cristian CristyXtreme Data 19 decembrie 2019 12:35:57
Problema Heavy metal Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream in("heavymetal.in");
ofstream out("heavymetal.out");

bool cmp(pair <int, int> &A, pair <int, int> &B) {
    if (A.second < B.second)
        return true;
    if (A.second > B.second)
        return false;
    return A.first < B.first;
}

int main() {
    int n;
    in >> n;

    vector <pair <int, int>> form(n);
    for (int i = 0; i < n; i++) {
        in >> form[i].first >> form[i].second;
    }

    sort(form.begin(), form.end(), cmp);

    for (auto &&el: form) {
        cout << el.first << '\n';
    }

    // dp[i] - cel mai bun cost daca selectam spectalolele din primele i (dupa capatul din dreapta)
    // dp[i] = max(dp[i - 1], form[i].y - form[i].x + dp[j] | j - cel mai mare index a.i. y.index < x.i)

    vector <int> dp(n);
    dp[0] = form[0].second - form[0].first;

    int left, right, middle, val, nr;
    for (int i = 1; i < n; i++) {
        val = -1;
        left = 0;
        right = i - 1;
        while (left <= right) {
            middle = left + (right - left) / 2;
            if (form[middle].second <= form[i].first) {
                val = middle;
                left = middle + 1;
            }
            else {
                right = middle - 1;
            }
        }

        dp[i] = dp[i - 1];
        if (val > -1) {
            nr = dp[val] + form[i].second - form[i].first;
            if (dp[i] < nr)
                dp[i] = nr;
        }
    }

    out << dp[n - 1];
    return 0;
}