Submission #489908

#TimeUsernameProblemLanguageResultExecution timeMemory
489908blueTreatment Project (JOI20_treatment)C++17
35 / 100
995 ms524292 KiB
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;

using vi = vector<int>;
using ll = long long;
using vl = vector<ll>;

const int mx = 5'000;

int N, M;
vi T(mx), L(mx), R(mx), C(mx);

int lw, rw;

vi edge[mx + 2];
vl wt[mx + 2];

void add_edge(int u, int v, ll w)
{
    edge[u].push_back(v);
    // edge[v].push_back(u); //check this later???
    wt[u].push_back(w);
    // wt[v].push_back(w);

    // cerr << "adding edge " << u << " -> " << v << '\n';
}

ll INF = 1'000'000'000'000'000'000LL;


vl lw_dist(mx+2, INF);

struct pos
{
    int i;
};

bool operator < (pos A, pos B)
{
    if(lw_dist[A.i] == lw_dist[B.i]) return A.i < B.i;
    return lw_dist[A.i] < lw_dist[B.i];
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> N >> M;
    for(int i = 0; i < M; i++)
    {
        cin >> T[i] >> L[i] >> R[i] >> C[i];
    }

    lw = M;
    rw = M + 1;

    for(int i = 0; i < M; i++)
    {
        for(int j = 0; j < M; j++)
        {
            if(j == i) continue;
            
            if(L[j] <= R[i] + 1 - abs(T[j] - T[i]) && R[i] + 1 - abs(T[j] - T[i]) <= R[j])
                    add_edge(i, j, C[i]);



        }
    }

    for(int i = 0; i < M; i++)
    {
        if(L[i] == 1) add_edge(lw, i, 0);

        if(R[i] == N) add_edge(i, rw, C[i]);
    }

    lw_dist[lw] = 0;
    // cerr << "check\n";

    set<pos> S;
    for(int i = 0; i < M+2; i++) S.insert(pos{i});
    while(!S.empty())
    {
        int u = S.begin()->i;
        S.erase(S.begin());

        for(int e = 0; e < int(edge[u].size()); e++)
        {
            int v = edge[u][e];
            ll w = wt[u][e];

            if(lw_dist[u] + w < lw_dist[v])
            {
                S.erase(pos{v});
                lw_dist[v] = lw_dist[u] + w;
                S.insert(pos{v});
            }
        }
    }

    if(lw_dist[rw] == INF) lw_dist[rw] = -1;
    cout << lw_dist[rw] << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...