답안 #203644

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
203644 2020-02-21T17:49:13 Z osaaateiasavtnl Olympic Bus (JOI20_ho_t4) C++14
100 / 100
166 ms 35612 KB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ii pair <int, int>
#define app push_back
#define all(a) a.begin(), a.end()
#define bp __builtin_popcount
#define ll long long
#define mp make_pair
#define f first
#define s second
#define Time (double)clock()/CLOCKS_PER_SEC
const int N = 1e5 + 7, INF = 1e18 + 7;
struct Edge {
    int u, v, c, d;
} e[N];  
  
struct Ed {
    int v, c, i;
};  
  
int n, m;
int dist1[N], par1[N], par_ed1[N], sec1[N], best1[N];
int distn[N], parn[N], par_edn[N], secn[N], bestn[N];
int tmp[N];
int dist1_rev[N], sec1_rev[N], best1_rev[N];;
int distn_rev[N], secn_rev[N], bestn_rev[N];
 
vector <Ed> g[N], gr[N];
int get1n(int u, int v) {
    return dist1[u] + distn_rev[v];
}
int getn1(int u, int v) {
    return distn[u] + dist1_rev[v];
}   
int get1n(int i) {
    return get1n(e[i].u, e[i].v) + e[i].c;
}   
int getn1(int i) {
    return getn1(e[i].u, e[i].v) + e[i].c;
}   
 
void dj(int S, int *dist, vector <Ed> g[N], int par[N], int par_ed[N], int sec[N], int best[N]) {
    for (int i = 0; i < N; ++i) {
        dist[i] = INF;
        best[i] = -1;
        sec[i] = INF;
    }
    set <ii> ms;
    dist[S] = 0;
    ms.insert(mp(0, S));
    while (ms.size()) {
        int u = ms.begin()->s;
        ms.erase(ms.begin());
        for (auto e : g[u]) {
            if (dist[u] + e.c < dist[e.v]) {
                ms.erase(mp(dist[e.v], e.v));
                sec[e.v] = dist[e.v];
                dist[e.v] = dist[u] + e.c;  
 
                par[e.v] = u;
                par_ed[e.v] = e.i;
 
                best[e.v] = e.i;
                ms.insert(mp(dist[e.v], e.v));
            }   
            else {
                sec[e.v] = min(sec[e.v], dist[u] + e.c);
            }   
        }   
    }   
}
  
int from1(int u, int ban) {
    if (ban != best1[u])
        return dist1[u];
    else
        return sec1[u];
}   
int ton(int u, int ban) {
    if (ban != bestn_rev[u])
        return distn_rev[u];
    else
        return secn_rev[u];
}   
int fromn(int u, int ban) {
    if (ban != bestn[u])
        return distn[u];
    else
        return secn[u];
}
int to1(int u, int ban) {
    if (ban != best1_rev[u])
        return dist1_rev[u];
    else
        return sec1_rev[u];
}   
  
int dist1n_del[N], distn1_del[N];
vector <int> tree[N], add[N], del[N];
bool used[N];
const int LG = 20;
int to[N][LG], tin[N], tout[N], timer = 0;
void dfs1(int u, int p) {
    to[u][0] = p;
    for (int i = 1; i < LG; ++i)
        to[u][i] = to[to[u][i - 1]][i - 1];
    tin[u] = timer++;
    for (int v : tree[u])
        dfs1(v, u);
    tout[u] = timer++;              
}   
bool anc(int u, int v) {
    return tin[u] <= tin[v] && tout[v] <= tout[u];
}   
bool vert(int u, int v) {
    return anc(u, v) || anc(v, u);
}   
int lca(int u, int v) {
    if (anc(u, v))
        return u;
    for (int i = LG - 1; i >= 0; --i)
        if (!anc(to[u][i], v))
            u = to[u][i];
    return to[u][0];
}   
 
bool inp1[N], inpn[N];
int getup(int u, int v) {
    if (anc(u, v))
        return u;
    else
        return v;            
}   
int mmin(int u, int v) {
    if (anc(u, v))
        return v;
    else
        return u;
}   
void upd(int &a, int b) {
    if (a == -1)
        a = b;
    else
        a = mmin(a, b);
}   
 
signed main() {
    #ifdef HOME
    freopen("input.txt", "r", stdin);
    #else
    ios_base::sync_with_stdio(0); cin.tie(0);
    #endif
    cin >> n >> m;
    for (int i = 0; i < m; ++i) {
        cin >> e[i].u >> e[i].v >> e[i].c >> e[i].d;
        g[e[i].u].app({e[i].v, e[i].c, i});
        gr[e[i].v].app({e[i].u, e[i].c, i});
    }
    dj(1, dist1, g, par1, par_ed1, sec1, best1); 
    dj(n, distn, g, parn, par_edn, secn, bestn); 
    dj(1, dist1_rev, gr, tmp, tmp, sec1_rev, best1_rev); 
    dj(n, distn_rev, gr, tmp, tmp, secn_rev, bestn_rev);
 
    for (int i = 2; i <= n; ++i) 
        if (par1[i]) {
            tree[par1[i]].app(i);
            used[par_ed1[i]] = 1;
        }   
    dfs1(1, 1);
    /*
    for (int i = 1; i <= n; ++i)
        cout << par1[i] << ' ';
    cout << '\n';
    */
    for (int i = 0; i < m; ++i) {
        if (!used[i]) {
            int l = lca(e[i].u, e[i].v);
            l = lca(l, n);
            int x = get1n(i);
            add[lca(e[i].u, n)].app(x);
            del[l].app(x);
            add[lca(e[i].v, n)].app(x);
            del[l].app(x);
        }   
    }
 
    if (!par1[n]) {
        for (int i = 0; i < N; ++i)
            dist1n_del[i] = INF;
    }
    else {
        for (int i = 0; i < N; ++i)
            dist1n_del[i] = dist1[n];
        int u = n;
        multiset <int> ms = {INF};
        while (u != 1) {
            //cout << "up " << u << '\n';
            for (int e : add[u]) {
                ms.insert(e);
                //cout << "insert " << e << '\n';
            }
            for (int e : del[u]) {
                ms.erase(ms.find(e));   
                //cout << "erase " << e << '\n';
            }
            dist1n_del[par_ed1[u]] = *ms.begin();
            inp1[par_ed1[u]] = 1;
            u = to[u][0];
        }   
    }    
 
    for (int i = 0; i < N; ++i) {
        tree[i].clear();
        add[i].clear();
        del[i].clear();
    }            
    memset(used, 0, sizeof used);            
    for (int i = 1; i < n; ++i)
        if (parn[i]) {
            tree[parn[i]].app(i);
            used[par_edn[i]] = 1;
        }   
 
    dfs1(n, n);
 
    for (int i = 0; i < m; ++i) {
        if (!used[i]) {
            int l = lca(e[i].u, e[i].v);
            l = lca(l, 1);
            int x = getn1(i);
            add[lca(e[i].u, 1)].app(x);
            del[l].app(x);
            add[lca(e[i].v, 1)].app(x);
            del[l].app(x);
        }   
    }           
 
    if (!parn[1]) {
        for (int i = 0; i < N; ++i)
            distn1_del[i] = INF;
    }   
    else {
        for (int i = 0; i < N; ++i)
            distn1_del[i] = distn[1];
        int u = 1;
        multiset <int> ms = {INF};
        while (u != n) {
            for (int e : add[u])
                ms.insert(e);
            for (int e : del[u])
                ms.erase(ms.find(e));
            distn1_del[par_edn[u]] = *ms.begin();
            inpn[par_edn[u]] = 1;
            u = to[u][0];
        }   
    }   
     
    #ifdef HOME
    for (int i = 0; i < m; ++i)
        cout << dist1n_del[i] << ' ';
    cout << '\n';
    for (int i = 0; i < m; ++i)
        cout << distn1_del[i] << ' ';
    cout << '\n';
    #endif
 
    int ans = dist1[n] + distn[1];
    for (int i = 0; i < m; ++i) {
        int d1n = INF, dn1 = INF;
        if (!inp1[i])
            d1n = from1(e[i].v, i) + ton(e[i].u, i) + e[i].c;
        if (!inpn[i])
            dn1 = fromn(e[i].v, i) + to1(e[i].u, i) + e[i].c;
        d1n = min(d1n, dist1n_del[i]);
        dn1 = min(dn1, distn1_del[i]);        
        ans = min(ans, d1n + dn1 + e[i].d);
        //cout << i << ' ' << d1n << ' ' << dn1 << ' ' << e[i].d << '\n';
    }
    if (ans > 1e12)
        cout << "-1\n";
    else
        cout << ans << '\n';
}
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 23416 KB Output is correct
2 Correct 17 ms 23288 KB Output is correct
3 Correct 19 ms 23544 KB Output is correct
4 Correct 20 ms 23544 KB Output is correct
5 Correct 19 ms 23416 KB Output is correct
6 Correct 17 ms 23288 KB Output is correct
7 Correct 17 ms 23160 KB Output is correct
8 Correct 17 ms 23160 KB Output is correct
9 Correct 18 ms 23288 KB Output is correct
10 Correct 19 ms 23420 KB Output is correct
11 Correct 19 ms 23416 KB Output is correct
12 Correct 20 ms 23416 KB Output is correct
13 Correct 19 ms 23416 KB Output is correct
14 Correct 20 ms 23420 KB Output is correct
15 Correct 21 ms 23416 KB Output is correct
16 Correct 21 ms 23416 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 166 ms 35148 KB Output is correct
2 Correct 123 ms 34052 KB Output is correct
3 Correct 120 ms 33248 KB Output is correct
4 Correct 22 ms 23672 KB Output is correct
5 Correct 19 ms 23420 KB Output is correct
6 Correct 18 ms 23292 KB Output is correct
7 Correct 19 ms 23288 KB Output is correct
8 Correct 18 ms 23160 KB Output is correct
9 Correct 85 ms 31812 KB Output is correct
10 Correct 85 ms 32476 KB Output is correct
11 Correct 118 ms 33368 KB Output is correct
12 Correct 119 ms 33232 KB Output is correct
13 Correct 114 ms 33672 KB Output is correct
14 Correct 122 ms 35612 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 23544 KB Output is correct
2 Correct 18 ms 23288 KB Output is correct
3 Correct 81 ms 30516 KB Output is correct
4 Correct 21 ms 23288 KB Output is correct
5 Correct 92 ms 32240 KB Output is correct
6 Correct 17 ms 23160 KB Output is correct
7 Correct 17 ms 23160 KB Output is correct
8 Correct 80 ms 31824 KB Output is correct
9 Correct 81 ms 31712 KB Output is correct
10 Correct 94 ms 31744 KB Output is correct
11 Correct 86 ms 33396 KB Output is correct
12 Correct 92 ms 34024 KB Output is correct
13 Correct 18 ms 23160 KB Output is correct
14 Correct 17 ms 23160 KB Output is correct
15 Correct 19 ms 23160 KB Output is correct
16 Correct 17 ms 23160 KB Output is correct
17 Correct 19 ms 23160 KB Output is correct
18 Correct 17 ms 23160 KB Output is correct
19 Correct 101 ms 31492 KB Output is correct
20 Correct 90 ms 33644 KB Output is correct
21 Correct 90 ms 33496 KB Output is correct
22 Correct 90 ms 34156 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 23416 KB Output is correct
2 Correct 17 ms 23288 KB Output is correct
3 Correct 19 ms 23544 KB Output is correct
4 Correct 20 ms 23544 KB Output is correct
5 Correct 19 ms 23416 KB Output is correct
6 Correct 17 ms 23288 KB Output is correct
7 Correct 17 ms 23160 KB Output is correct
8 Correct 17 ms 23160 KB Output is correct
9 Correct 18 ms 23288 KB Output is correct
10 Correct 19 ms 23420 KB Output is correct
11 Correct 19 ms 23416 KB Output is correct
12 Correct 20 ms 23416 KB Output is correct
13 Correct 19 ms 23416 KB Output is correct
14 Correct 20 ms 23420 KB Output is correct
15 Correct 21 ms 23416 KB Output is correct
16 Correct 21 ms 23416 KB Output is correct
17 Correct 166 ms 35148 KB Output is correct
18 Correct 123 ms 34052 KB Output is correct
19 Correct 120 ms 33248 KB Output is correct
20 Correct 22 ms 23672 KB Output is correct
21 Correct 19 ms 23420 KB Output is correct
22 Correct 18 ms 23292 KB Output is correct
23 Correct 19 ms 23288 KB Output is correct
24 Correct 18 ms 23160 KB Output is correct
25 Correct 85 ms 31812 KB Output is correct
26 Correct 85 ms 32476 KB Output is correct
27 Correct 118 ms 33368 KB Output is correct
28 Correct 119 ms 33232 KB Output is correct
29 Correct 114 ms 33672 KB Output is correct
30 Correct 122 ms 35612 KB Output is correct
31 Correct 20 ms 23544 KB Output is correct
32 Correct 18 ms 23288 KB Output is correct
33 Correct 81 ms 30516 KB Output is correct
34 Correct 21 ms 23288 KB Output is correct
35 Correct 92 ms 32240 KB Output is correct
36 Correct 17 ms 23160 KB Output is correct
37 Correct 17 ms 23160 KB Output is correct
38 Correct 80 ms 31824 KB Output is correct
39 Correct 81 ms 31712 KB Output is correct
40 Correct 94 ms 31744 KB Output is correct
41 Correct 86 ms 33396 KB Output is correct
42 Correct 92 ms 34024 KB Output is correct
43 Correct 18 ms 23160 KB Output is correct
44 Correct 17 ms 23160 KB Output is correct
45 Correct 19 ms 23160 KB Output is correct
46 Correct 17 ms 23160 KB Output is correct
47 Correct 19 ms 23160 KB Output is correct
48 Correct 17 ms 23160 KB Output is correct
49 Correct 101 ms 31492 KB Output is correct
50 Correct 90 ms 33644 KB Output is correct
51 Correct 90 ms 33496 KB Output is correct
52 Correct 90 ms 34156 KB Output is correct
53 Correct 111 ms 31824 KB Output is correct
54 Correct 117 ms 33476 KB Output is correct
55 Correct 142 ms 33128 KB Output is correct
56 Correct 20 ms 23544 KB Output is correct
57 Correct 20 ms 23416 KB Output is correct
58 Correct 122 ms 30152 KB Output is correct
59 Correct 118 ms 30128 KB Output is correct
60 Correct 112 ms 30096 KB Output is correct
61 Correct 130 ms 30956 KB Output is correct
62 Correct 115 ms 30140 KB Output is correct
63 Correct 115 ms 30124 KB Output is correct
64 Correct 116 ms 30476 KB Output is correct
65 Correct 117 ms 30520 KB Output is correct
66 Correct 119 ms 30472 KB Output is correct
67 Correct 57 ms 30244 KB Output is correct
68 Correct 86 ms 32168 KB Output is correct
69 Correct 86 ms 32612 KB Output is correct
70 Correct 129 ms 33200 KB Output is correct
71 Correct 122 ms 32240 KB Output is correct
72 Correct 107 ms 33736 KB Output is correct
73 Correct 127 ms 33988 KB Output is correct
74 Correct 113 ms 31664 KB Output is correct