Submission #1190610

#TimeUsernameProblemLanguageResultExecution timeMemory
1190610MateiKing80Escape Route (JOI21_escape_route)C++20
100 / 100
2383 ms160596 KiB
#include <bits/stdc++.h>
#include "escape_route.h"

using namespace std;

using ll = long long;
using pii = pair<int, int>;
#define fr first
#define sc second
const ll inf = 1e18;

vector<ll> calculate_necessary_time(int N, int M, ll S, int Q, vector<int> A, vector<int> B,
                                    vector<ll> L, vector<ll> C, vector<int> U, vector<int> V, vector<ll> T)
{

    vector<vector<ll>> c(N, vector<ll>(N, S));
    vector<vector<ll>> l(N, vector<ll>(N, S));
    for (int i = 0; i < M; i ++)
    {
        c[A[i]][B[i]] = c[B[i]][A[i]] = C[i];
        l[A[i]][B[i]] = l[B[i]][A[i]] = L[i];
    }
    for (int i = 0; i < N; i ++)
        c[i][i] = l[i][i] = 0;
    auto dijkstra = [&](int p, int s)
    {
        vector<ll> d(N, inf);
        vector<bool> used(N, false);
        d[s] = c[p][s];
        for (int turip = 0; turip < N; turip ++)
        {
            int u = -1;
            for (int i = 0; i < N; i ++)
                if (!used[i] && (u == -1 || d[i] < d[u]))
                    u = i;
            used[u] = true;
            for (int v = 0; v < N; v ++)
            {
                if (used[v] || c[u][v] >= S)
                    continue;
                ll dd = d[u] + l[u][v];
                if (d[u] % S + l[u][v] > c[u][v])
                    dd += S - d[u] % S;
                d[v] = min(d[v], dd);
            }
        }
        return d;
    };

    vector<vector<vector<ll>>> d(N, vector<vector<ll>> (N, vector<ll>(N, inf)));
    for (int i = 0; i < N; i ++)
        for (int j = 0; j < N; j ++)
            if (c[i][j] < S)
                d[i][j] = dijkstra(i, j);

    vector<ll> res(Q, inf);
    for (int i = 0; i < Q; i ++)
        res[i]= d[U[i]][U[i]][V[i]] + (S - T[i]) % S;

    for (int st = 0; st < N; st ++)
    {
        vector<pair<ll,int>> qq;
        for (int i = 0; i < Q; i ++)
            if(U[i] == st)
                qq.push_back({T[i], i});
        sort(qq.begin(), qq.end());
        vector<vector<pair<ll, int>>> ord(N);
        for (int i = 0; i < N; i ++)
        {
            for (int j = 0; j < N; j ++)
                if (i != j && c[i][j] < S)
                    ord[i].push_back({c[i][j] - l[i][j], j});
            sort(ord[i].rbegin(), ord[i].rend());
        }
        vector<int> pos(N, 0);
        vector<ll> dd(N, inf);
        dd[st] = 0;

        while (!qq.empty())
        {
            pair<ll, int> Max = {-1, -1};
            for (int i = 0; i < N; i ++)
                if (pos[i] < (int)ord[i].size())
                    Max = max(Max, {ord[i][pos[i]].fr - dd[i], i});
            while (!qq.empty() && qq.back().fr > Max.fr)
            {
                int id = qq.back().sc;
                qq.pop_back();
                res[id] = min(res[id], dd[V[id]]);
                for (int i = 0; i < N; i ++)
                {
                    if (dd[i] == inf)
                        continue;
                    res[id] = min(res[id], S - T[id] + d[i][i][V[id]]);
                }
            }
            if(Max.fr == -1)
                break;
            int u = Max.sc;
            int v = ord[u][pos[Max.sc] ++].sc;
            for (int i = 0; i < N; i ++)
                if(d[u][v][i] < S)
                    dd[i] = min(dd[i], d[u][v][i] - Max.fr);
        }
    }

    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...