Cod sursa(job #2091936)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 20 decembrie 2017 17:06:00
Problema Gardieni Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>
#include <cstdio>
#include <algorithm>
#include <vector>
#define VAL 50015

using namespace std;

struct interval
{
    int be, en, cost;
};

interval P[VAL];

int N, T, i, j, mn, k;
long long ANS;
vector <interval> S[2];

bool cmp(interval A, interval B)
{
    if (A.be==B.be)
      return A.en<B.en;
    return A.be<B.be;
}

char buff[VAL];
int poz=0;

int citire()
{
    int nr=0;
    while (buff[poz]<'0' || '9'<buff[poz])
      if (++poz==VAL)
        fread(buff, 1, VAL, stdin), poz=0;
    while ('0'<=buff[poz] && buff[poz]<='9')
    {
        nr=nr*10+buff[poz]-'0';
        if (++poz==VAL)
          fread(buff, 1, VAL, stdin), poz=0;
    }
    return nr;
}

int main()
{
    freopen("gardieni.in", "r", stdin);
    freopen("gardieni.out", "w", stdout);
    N=citire();
    T=citire();
    for (i=1; i<=N; i++)
    {
        P[i].be=citire();
        P[i].en=citire();
        P[i].cost=citire();
    }
    sort(P+1, P+N+1, cmp);
    for (i=1; i<=T; i++)
    {
        S[i % 2].clear();
        mn=(1 << 25);
        for (j=0; j<S[1-(i % 2)].size(); j++)
        {
            if (S[1-(i % 2)][j].be<=i && i<=S[1-(i % 2)][j].en)
            {
                S[i % 2].push_back(S[1-(i % 2)][j]);
                mn=min(mn, S[1-(i % 2)][j].cost);
            }
        }
        while (P[k+1].be<=i && i<=P[k+1].en)
        {
            mn=min(mn, P[k+1].cost);
            k++;
            S[i % 2].push_back(P[k]);
        }
        ANS+=mn;
    }
    printf("%lld\n", ANS);
    return 0;
}