Cod sursa(job #2978096)

Utilizator pielevladutPiele Vladut Stefan pielevladut Data 12 februarie 2023 22:50:02
Problema Stalpi Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>

#define int long long

using namespace std;

ifstream fin("stalpi.in");
ofstream fout("stalpi.out");

const int nmax = 100000;

int n;
struct elem
{
    int poz, cost;
    int st, dr;
    bool operator < (const elem &other) const
    {
        return poz < other.poz;
    }
};
elem v[nmax + 5];
int dp[nmax + 5];

int findPos(int poz)
{
    int st = 0, dr = n;
    int r = 0;
    while(st <= dr)
    {
        int mid = (st + dr) >> 1;
        if(v[mid].poz < poz)
        {
            st = mid + 1;
            r = mid;
        }
        else
        {
            dr = mid - 1;
        }
    }
    return r;
}

signed main()
{
    fin >> n;
    for(int i = 1; i <= n; i ++)
    {
        fin >> v[i].poz >> v[i].cost;
        fin >> v[i].st >> v[i].dr;
        dp[i] = 1e9;
    }
    sort(v + 1, v + n + 1);
    dp[0] = 0;
    for(int i = 1; i <= n; i ++)
    {
        for(int j = 1; j <= n; j ++)
        {
            int left = max(1LL, v[j].poz - v[j].st);
            int right = v[j].poz + v[j].dr;
            if(v[i].poz >= left && v[i].poz <= right)
            {
                int last = findPos(left);
                dp[i] = min(dp[i], dp[last] + v[j].cost);
            }
        }
    }
    fout << dp[n] << '\n';
    return 0;
}