Cod sursa(job #2970985)

Utilizator mateitudordmDumitru Matei mateitudordm Data 26 ianuarie 2023 11:27:24
Problema Stalpi Scor 10
Compilator cpp-64 Status done
Runda sa_fac_schema Marime 1.74 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream cin ("stalpi.in");
ofstream cout ("stalpi.out");

const int nmax = 1e5, inf = 1e9;

int n, dp[nmax + 1];

struct cell
{
    int x, c, s, d;
};
bool cmpx (cell a, cell b)
{
    return a.x < b.x;
}
cell v[nmax + 1];

int search_firsti (int x)
{
    int st = 0, dr = n, mij, sol;
    st = 0, dr = n;

    while (st <= dr)
    {
        mij = (st + dr) / 2;
        //cout << mij << " " << v[mij].x << " " << x << '\n';

        if (v[mij].x < x)
            sol = mij, st = mij + 1;
        else
            dr = mij - 1;
    }
    //cout << "X" << '\n';

    return sol;
}

int search_lasti (int x)
{
    int st = 0, dr = n, mij, sol;

    while (st <= dr)
    {
        mij = (st + dr) / 2;

        if (v[mij].x <= x)
            sol = mij, st = mij + 1;
        else
            dr = mij - 1;
    }

    return sol;
}

int main()
{
    int i, j, lasti, firsti, minn;
    cin >> n;

    for (i = 1; i <= n; i++)
        cin >> v[i].x >> v[i].c >> v[i].s >> v[i].d, dp[i] = inf;
    sort (v + 1, v + n + 1, cmpx);

    dp[0] = 0;

    for (i = 1; i <= n; i++)
    {
        if (v[i].x <= v[1].x + v[1].d)
            dp[i] = v[i].c;
    }
    for (i = 2; i <= n; i++)
    {
        minn = inf;
        firsti = search_firsti (v[i].x - v[i].s);

        //cout << v[i].x << " " << v[i].c << " " << v[i].s << " " << v[i].d << '\n';
        //cout << firsti << '\n';

        for (j = firsti; j <= i; j++)
            minn = min (minn, dp[j]);

        lasti = search_lasti (v[i].x + v[i].d);

        for (j = i; j <= lasti; j++)
            dp[j] = min (dp[j], minn + v[i].c);
    }

    cout << dp[n];

    return 0;
}