QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#822655#3095. Escape RouteMax_s_xaM0 3ms67692kbC++175.4kb2024-12-20 15:17:372024-12-20 15:17:38

Judging History

This is the latest submission verdict.

  • [2024-12-20 15:17:38]
  • Judged
  • Verdict: 0
  • Time: 3ms
  • Memory: 67692kb
  • [2024-12-20 15:17:37]
  • Submitted

answer

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <random>
#include <ctime>
#include <chrono>
#include <numeric>
#include <iomanip>
#include <cassert>

typedef long long ll;
typedef double lf;
typedef unsigned long long ull;

using namespace std;

const int MAXN = 95;
const ll INF = 1e18;

int n, m; ll S;
ll e[MAXN][MAXN], c[MAXN][MAXN];

ll dis1[MAXN][MAXN]; bool vis[MAXN];
inline ll Calc(int u, int v, ll d)
{
    ll t = d % S;
    if (d <= c[u][v]) return d + e[u][v];
    return d - t + S + e[u][v];
}
inline void Dijkstra1(int s)
{
    for (int i = 0; i < n; i++) dis1[s][i] = INF, vis[i] = 0;
    dis1[s][s] = 0;
    for (int _ = 0; _ < n; _++)
    {
        int u = 0; ll mn = INF;
        for (int i = 0; i < n; i++)
            if (!vis[i] && mn > dis1[s][i]) u = i, mn = dis1[s][i];
        if (mn == INF) break;
        vis[u] = 1;
        for (int v = 0; v < n; v++)
            if (!vis[v]) dis1[s][v] = min(dis1[s][v], Calc(u, v, dis1[s][u]));
    }
}

ll dis2[MAXN][MAXN];
inline void Dijkstra2(int s)
{
    for (int i = 0; i < n; i++) dis2[s][i] = -INF, vis[i] = 0;
    dis2[s][s] = S;
    for (int _ = 0; _ < n; _++)
    {
        int u = 0; ll mx = -INF;
        for (int i = 0; i < n; i++)
            if (!vis[i] && mx < dis2[s][i]) u = i, mx = dis2[s][i];
        if (mx < 0) break;
        vis[u] = 1;
        for (int v = 0; v < n; v++)
            if (!vis[v]) dis2[s][v] = max(dis2[s][v], min(dis2[s][u] - e[u][v], c[u][v]));
    }
}

vector <ll> Tm[MAXN];
vector <vector <ll>> dis3[MAXN];
set <pair <ll, int>, greater <pair <ll, int>>> st;
int rk[MAXN][MAXN], tp[MAXN];
vector <pair <int, ll>> g[MAXN];
void DFS(vector <ll> &dis, int u)
{
    for (auto [v, w] : g[u])
        if (dis[v] > dis[u] + w)
        {
            if (c[u][rk[u][tp[u]]])
            {
                st.erase(make_pair(c[v][rk[v][tp[v]]] - dis[v], v));
                st.emplace(c[v][rk[v][tp[v]]] - dis[u] - w, v);
            }
            dis[v] = dis[u] + w, DFS(dis, v);
        }
}
void Build(vector <ll> &dis, int u)
{
    vis[u] = 1;
    for (int i = 0; i < g[u].size(); i++)
    {
        int v = g[u][i].first;
        if (vis[v] || dis[v] < dis[u] + g[u][i].second) swap(g[u][i], g[u].back()), g[u].pop_back();
        else Build(dis, v);
    }
}
inline void Insert(int s, int t, int u, int v)
{
    if (dis3[s][t][u] > dis3[s][t][v]) swap(u, v);
    if (dis3[s][t][u] + e[u][v] >= dis3[s][t][v]) return;
    g[u].emplace_back(v, e[u][v]), g[v].emplace_back(u, e[u][v]);
    DFS(dis3[s][t], u);
    memset(vis, 0, sizeof(vis));
    Build(dis3[s][t], s);
}

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)
{
    n = N, m = M, ::S = S;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) 
            e[i][j] = INF;
    for (int i = 0; i < m; i++) e[A[i]][B[i]] = e[B[i]][A[i]] = L[i], c[A[i]][B[i]] = c[B[i]][A[i]] = C[i] - L[i];
    for (int i = 0; i < n; i++) Dijkstra1(i);
    for (int i = 0; i < n; i++) Dijkstra2(i);
    for (int i = 0; i < n; i++)
    {
        iota(rk[i], rk[i] + n, 0);
        sort(rk[i], rk[i] + n, [&](int x, int y) { return c[i][x] > c[i][y]; });
    }
    // for (int i = 0; i < n; i++, cout << "\n")
    //     for (int j = 0; j < n; j++)
    //         cout << e[i][j] << ' ';
    // for (int i = 0; i < n; i++, cout << "\n")
    //     for (int j = 0; j < n; j++)
    //         cout << dis1[i][j] << ' ';
    // for (int i = 0; i < n; i++, cout << "\n")
    //     for (int j = 0; j < n; j++)
    //         cout << dis2[i][j] << ' ';
    for (int s = 0; s < n; s++)
    {
        for (int i = 0; i < n; i++) tp[i] = 0, g[i].clear();
        Tm[s].push_back(S), dis3[s].push_back(vector <ll>(n, INF));
        dis3[s][0][s] = 0, st.clear();
        for (int i = 0; i < n; i++) st.emplace(c[i][rk[i][tp[i]]] - dis3[s][0][i], i);
        for (int t = 0; st.size(); t++)
        {
            ll nxtT = st.begin() -> first;
            assert(nxtT < Tm[s][t]);
            if (nxtT < 0) break;
            Tm[s].push_back(nxtT), dis3[s].push_back(dis3[s].back());
            while (st.size() && st.begin() -> first >= nxtT)
            {
                int u = st.begin() -> second; st.erase(st.begin());
                if (c[u][rk[u][++tp[u]]]) st.emplace(c[u][rk[u][tp[u]]] - dis3[s][t + 1][u], u);
                Insert(s, t + 1, u, rk[u][tp[u] - 1]);
            }
        }
    }
    // for (int s = 0; s < n; s++)
    // {
    //     cout << "S " << s << ":\n";
    //     for (int i = 0; i < Tm[s].size(); i++)
    //     {
    //         cout << Tm[s][i] << ": ";
    //         for (int j = 0; j < n; j++) cout << dis3[s][i][j] << ' '; cout << "\n";
    //     }
    // }
    vector <ll> answer(Q);
    for (int i = 0; i < Q; i++)
    {
        int u = U[i], v = V[i]; ll t = T[i], ans = INF;
        for (int j = 0; j < n; j++)
            if (dis2[j][u] >= t) ans = min(ans, S - t + dis1[j][v]);
        int it = upper_bound(Tm[u].begin(), Tm[u].end(), t, greater <ll>()) - Tm[u].begin() - 1;
        // cout << ans << ' ' << dis3[u][it][v] << "\n";
        ans = min(ans, dis3[u][it][v]);
        answer[i] = ans;
    }
    return answer;
}

// #include "A.h"

詳細信息

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 3ms
memory: 67692kb

input:

20 25 1000000000 1000
19 14 90509532 395178972
6 12 52555823 230197434
9 6 41978234 90329771
6 18 8293185 824071496
0 13 35999620 908026854
2 18 17143126 46209532
17 8 2146423 625200489
3 7 22505966 277897576
7 16 95978223 450666887
5 18 22992288 305443621
13 3 54291836 100388711
13 15 14415203 8317...

output:

480557149
731813221
531968775
431599596
694448121
715925162
692048139
374020064
35999620
419096231
298628112
358760644
169005469
851402422
930706705
525115250
448178961
167407909
675296534
360680519
728933035
173728392
490870115
131283187
959675305
227201702
960691395
521737971
378591732
907571408
3...

result:

wrong answer 25th lines differ - expected: '493383137', found: '959675305'

Subtask #2:

score: 0
Runtime Error

Test #7:

score: 0
Runtime Error

input:

40 780 1000000000 3000000
35 37 7260282 695891301
0 29 4 333333333
31 34 1966 107334225
30 21 9922473 991394502
21 23 6724109 636376098
4 20 8364 818222403
12 9 9039 893222328
12 15 8446144 827521983
17 1 1914 101556453
2 4 3 222222222
2 8 9302 922444521
38 29 7432469 715004058
16 30 8 777777777
20 ...

output:


result:


Subtask #3:

score: 0
Skipped

Dependency #1:

0%

Subtask #4:

score: 0
Skipped

Dependency #3:

0%

Subtask #5:

score: 0
Skipped

Dependency #4:

0%