Submission #381160

# Submission time Handle Problem Language Result Execution time Memory
381160 2021-03-24T16:37:38 Z usachevd0 Robot (JOI21_ho_t4) C++14
100 / 100
1739 ms 96792 KB
#include <bits/stdc++.h>

using namespace std;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define all(a) (a).begin(), (a).end()
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;
using pil = pair<int, ll>;
using pli = pair<ll, int>;
using pll = pair<ll, ll>;
using ld = long double;
template<typename T1, typename T2> bool chkmin(T1 &x, T2 y) { return y < x ? (x = y, true) : false; }
template<typename T1, typename T2> bool chkmax(T1 &x, T2 y) { return y > x ? (x = y, true) : false; }
void debug_out() { cerr << endl; }
template<typename T1, typename... T2> void debug_out(T1 A, T2... B) { cerr << ' ' << A; debug_out(B...); }
template<typename T> void mdebug_out(T* a, int n) { for (int i = 0; i < n; ++i) cerr << a[i] << ' '; cerr << endl; }
#ifdef DEBUG
    #define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
    #define mdebug(a, n) cerr << #a << ": ", mdebug_out(a, n)
#else
    #define debug(...) 1337
    #define mdebug(a, n) 1337
#endif
template<typename T> ostream& operator << (ostream& stream, const vector<T> &v) { for (auto x : v) stream << x << ' '; return stream; }
template<typename T1, typename T2> ostream& operator << (ostream& stream, const pair<T1, T2>& p) { return stream << p.first << ' ' << p.second; }

#define int ll

const ll INF64 = 1e18;
const int N = 100005;
int n, m;
struct Edge
{
    int from, to, t;
    ll c;

    Edge() {}
    Edge(int _from, int _to, int _t, ll _c): from(_from), to(_to), t(_t), c(_c) {}
};
vector<Edge> G[N];

void add_edge(int a, int b, int t, ll c)
{
    G[a].emplace_back(a, b, t, c);
    G[b].emplace_back(b, a, t, c);
}

map<pii, int> ctp;

int types[N];
vector<int> rtp[N];
int idxt[2 * N];

vector<vector<Edge>> GT[N];

vector<ll> sumC[N];
vector<ll> dist[N];
          
signed main()
{
#ifdef DEBUG
    freopen("in", "r", stdin);
#endif
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> m;
    for (int i = 1; i <= m; ++i)
    {
        int a, b, t, c;
        cin >> a >> b >> t >> c;
        add_edge(a, b, t, c);
    }
    for (int v = 1; v <= n; ++v)
    {
        types[v] = 0;
        rtp[v] = {-1};
        for (auto& e : G[v])
            if (!idxt[e.t])
            {
                ++types[v];
                ctp[{v, e.t}] = idxt[e.t] = types[v];
                rtp[v].push_back(e.t);
            }

        GT[v].resize(types[v] + 1);
        for (auto e : G[v])
            GT[v][idxt[e.t]].push_back(e);

        sumC[v].assign(types[v] + 1, 0);
        for (auto& e : G[v])
            sumC[v][idxt[e.t]] += e.c;

        for (auto& e : G[v])
            idxt[e.t] = 0;
    }
    /*for (int v = 1; v <= n; ++v)
    {
        debug(v);
        debug(rtp[v]);
    }*/
    for (int v = 1; v <= n; ++v)
        dist[v].assign(types[v] + 1, INF64);
    dist[1][0] = 0;
    multiset<pair<ll, pii>> q;
    q.insert({0, {1, 0}});
    while (!q.empty())
    {
        ll d = q.begin()->fi;
        int v = q.begin()->se.fi;
        int ct = q.begin()->se.se;
        q.erase(q.begin());
        if (d != dist[v][ct]) continue;

        if (ct == 0)
        {
            for (auto& e : G[v])
            {
                int u = e.to;
                int ct = ctp[{v, e.t}];
                if (chkmin(dist[u][0], d + min(e.c, sumC[v][ct] - e.c)))
                    q.insert({dist[u][0], {u, 0}});
                int ctu = ctp[{u, e.t}];
                if (chkmin(dist[u][ctu], d))
                    q.insert({dist[u][ctu], {u, ctu}});
            }
        }
        else
        {
            int t = rtp[v][ct];
            for (auto& e : GT[v][ct])
            {
                if (e.t == t)
                {
                    int u = e.to;
                    int ctu = ctp[{u, t}];
                    if (chkmin(dist[u][0], d + sumC[v][ct] - e.c))
                        q.insert({dist[u][0], {u, 0}});
                }
            }
        }
    }
    cout << (dist[n][0] >= INF64 ? -1 : dist[n][0]) << '\n';

    return 0;
}

Compilation message

Main.cpp: In function 'int main()':
Main.cpp:141:25: warning: unused variable 'ctu' [-Wunused-variable]
  141 |                     int ctu = ctp[{u, t}];
      |                         ^~~
# Verdict Execution time Memory Grader output
1 Correct 9 ms 12140 KB Output is correct
2 Correct 10 ms 12140 KB Output is correct
3 Correct 9 ms 12140 KB Output is correct
4 Correct 19 ms 12140 KB Output is correct
5 Correct 10 ms 12140 KB Output is correct
6 Correct 20 ms 12140 KB Output is correct
7 Correct 11 ms 12396 KB Output is correct
8 Correct 9 ms 12268 KB Output is correct
9 Correct 14 ms 12908 KB Output is correct
10 Correct 13 ms 12908 KB Output is correct
11 Correct 12 ms 12780 KB Output is correct
12 Correct 15 ms 12652 KB Output is correct
13 Correct 13 ms 12780 KB Output is correct
14 Correct 23 ms 12780 KB Output is correct
15 Correct 12 ms 12524 KB Output is correct
16 Correct 14 ms 12680 KB Output is correct
17 Correct 12 ms 12652 KB Output is correct
18 Correct 21 ms 12396 KB Output is correct
19 Correct 25 ms 12652 KB Output is correct
20 Correct 12 ms 12656 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 477 ms 39836 KB Output is correct
2 Correct 184 ms 25452 KB Output is correct
3 Correct 498 ms 46896 KB Output is correct
4 Correct 301 ms 31372 KB Output is correct
5 Correct 1485 ms 93796 KB Output is correct
6 Correct 1214 ms 85760 KB Output is correct
7 Correct 867 ms 79896 KB Output is correct
8 Correct 726 ms 73868 KB Output is correct
9 Correct 920 ms 74108 KB Output is correct
10 Correct 641 ms 57876 KB Output is correct
11 Correct 204 ms 48748 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 12140 KB Output is correct
2 Correct 10 ms 12140 KB Output is correct
3 Correct 9 ms 12140 KB Output is correct
4 Correct 19 ms 12140 KB Output is correct
5 Correct 10 ms 12140 KB Output is correct
6 Correct 20 ms 12140 KB Output is correct
7 Correct 11 ms 12396 KB Output is correct
8 Correct 9 ms 12268 KB Output is correct
9 Correct 14 ms 12908 KB Output is correct
10 Correct 13 ms 12908 KB Output is correct
11 Correct 12 ms 12780 KB Output is correct
12 Correct 15 ms 12652 KB Output is correct
13 Correct 13 ms 12780 KB Output is correct
14 Correct 23 ms 12780 KB Output is correct
15 Correct 12 ms 12524 KB Output is correct
16 Correct 14 ms 12680 KB Output is correct
17 Correct 12 ms 12652 KB Output is correct
18 Correct 21 ms 12396 KB Output is correct
19 Correct 25 ms 12652 KB Output is correct
20 Correct 12 ms 12656 KB Output is correct
21 Correct 477 ms 39836 KB Output is correct
22 Correct 184 ms 25452 KB Output is correct
23 Correct 498 ms 46896 KB Output is correct
24 Correct 301 ms 31372 KB Output is correct
25 Correct 1485 ms 93796 KB Output is correct
26 Correct 1214 ms 85760 KB Output is correct
27 Correct 867 ms 79896 KB Output is correct
28 Correct 726 ms 73868 KB Output is correct
29 Correct 920 ms 74108 KB Output is correct
30 Correct 641 ms 57876 KB Output is correct
31 Correct 204 ms 48748 KB Output is correct
32 Correct 285 ms 43100 KB Output is correct
33 Correct 493 ms 44524 KB Output is correct
34 Correct 879 ms 62228 KB Output is correct
35 Correct 742 ms 52924 KB Output is correct
36 Correct 725 ms 60356 KB Output is correct
37 Correct 861 ms 68648 KB Output is correct
38 Correct 907 ms 85844 KB Output is correct
39 Correct 361 ms 53972 KB Output is correct
40 Correct 791 ms 75208 KB Output is correct
41 Correct 949 ms 75648 KB Output is correct
42 Correct 1148 ms 80124 KB Output is correct
43 Correct 375 ms 44544 KB Output is correct
44 Correct 796 ms 63672 KB Output is correct
45 Correct 836 ms 65028 KB Output is correct
46 Correct 590 ms 62828 KB Output is correct
47 Correct 778 ms 66768 KB Output is correct
48 Correct 1739 ms 96792 KB Output is correct