Cod sursa(job #2871051)

Utilizator pifaDumitru Andrei Denis pifa Data 12 martie 2022 20:25:08
Problema Heavy metal Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N = 100001;

int n;

pair <int, int> a[N + 1];

int lg[N + 1], last[N + 1];

bool cmp(pair <int, int> a, pair <int, int> b)
{
    if(a.second < b.second)
        return 1;
    else if (a.second == b.second && a.first < b.first)
        return 1;
    return 0;
}

bool ok(int a , int b , int x , int y)
{
    if(a < x && x < b)
        return true;
    if(a < y && y < b)
        return true;
    if(x < a && a < y)
        return true;
    if(x < b && b < y)
        return true;
    return false;
}

int main()
{
    in >> n;
    for(int i = 1; i <= n; i++)
    {
        in >> a[i].first >> a[i].second;
    }
    sort(a + 1, a + n + 1, cmp);
    vector <pair <int, int>> v;
    int lmax = 0;
    for(int i = 1; i <= n; i++)
    {
        v.push_back({a[i].first, a[i].second});
    }
    for(int i = 0; i < v.size(); i++)
    {
        if(v[i].first == v[i + 1].first && v[i + 1].second > v[i].second)
        {
            v.erase(v.begin()+ i);
        }
    }
    for(int i = 0; i < v.size(); i++)
    {
        last[i] = -1;
        lg[i] = 1;
        for(int j = 0; j < i; j++)
            if(lg[i] < lg[j] + 1 && !ok(v[j].first, v[j].second, v[i].first, v[i].second))
            {
                last[i] = j;
                lg[i] = lg[j] + 1;
            }
        lmax = max(lmax, lg[i]);
    }
    int maxim = 0, poz = 0;
    for(int i = 0; i < v.size(); i++)
    {
        if(lg[i] > maxim)
        {
            maxim = lg[i];
            poz = i;
        }
    }
    vector <pair <int, int>> ans;
    while(poz != -1)
    {
        ans.push_back(v[poz]);
        poz = last[poz];
    }
    int sum = 0;
    for(int i = 0; i < ans.size(); i++)
    {
        sum += (ans[i].second - ans[i].first);
    }
    out << sum;
    return 0;
}