Cod sursa(job #1911061)

Utilizator BugirosRobert Bugiros Data 7 martie 2017 19:19:49
Problema Stalpi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <algorithm>
using namespace std;

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

const int MAXN = 100005;
const int INF = 1 << 29;

struct stalp
{
    int cost,st,dr;
}stalpi[MAXN];

bool ordine_buna(stalp a, stalp b)
{
    return a.st > b.st;
}

int n;

int poz[MAXN];//pozitiile stalpilor

int aib[MAXN];

void setare_aib(int poz, int nr)
{
    while (poz <= n + 1)
    {
        aib[poz] = min(aib[poz], nr);
        poz += poz & -poz;
    }
}

int minim_aib(int poz)
{
    int rasp = INF;
    while(poz >= 1)
    {
        rasp = min(rasp, aib[poz]);
        poz -= poz & -poz;
    }
    return rasp;
}

void citire()
{
    in >> n;
    for (int i = 1;i <= n;++i)
    {
        int st, dr;
        in >> poz[i] >> stalpi[i].cost >> st >> dr;
        stalpi[i].st = poz[i] - st;
        stalpi[i].dr = poz[i] + dr;
    }
}

void prelucrare()
{
    sort(poz + 1, poz + n + 1);
    poz[n + 1] = (1ll << 31) - 1;
    sort(stalpi + 1, stalpi + n + 1, ordine_buna);

    for (int i = 0;i < MAXN;++i)
        aib[i] = INF;

    setare_aib(n + 1, 0);

    for (int i = 1;i <= n;++i)
    {
        int st = lower_bound(poz + 1, poz + n + 1, stalpi[i].st) - poz;
        int dr = upper_bound(poz + 1, poz + n + 2, stalpi[i].dr) - poz;
        setare_aib(st, minim_aib(dr) + stalpi[i].cost);
    }
}

int main()
{
    citire();
    prelucrare();
    out << minim_aib(1) << '\n';
    return 0;
}