Submission #834571

# Submission time Handle Problem Language Result Execution time Memory
834571 2023-08-22T15:29:17 Z _martynas Aesthetic (NOI20_aesthetic) C++11
100 / 100
857 ms 94492 KB
#include <bits/stdc++.h>
    
using namespace std;
    
using ll = long long;
    
#warning change mxn
const int mxn = 3e5+5;
const ll inf = 1e16;
    
struct Edge {
    int to, id;
};
    
int n, m;
int A[mxn], B[mxn];
vector<Edge> adj[mxn];
ll W[mxn];
vector<Edge> adj2[mxn];
bool isbridge[mxn], visited[mxn];
vector<ll> from1, fromn;
    
vector<ll> get_min_dist(int start) {
    vector<long long> dist(n+1, inf);
    priority_queue<pair<ll, int>> pq;
    dist[start] = 0;
    pq.push({-dist[start], start});;
    while(!pq.empty()) {
        ll d = -pq.top().first;
        int a = pq.top().second;
        pq.pop();
        if(dist[a] != d) continue;
        for(auto e : adj[a]) if(dist[e.to] > d+W[e.id]) {
            dist[e.to] = d+W[e.id];
            pq.push({-dist[e.to], e.to});
        }
    }
    return dist;
}
    
    
int tim = 0;
int disc[mxn], low[mxn];
bool onpathton[mxn];
void bridge_det(int u, int par) {
    visited[u] = true;
    if(u == n) onpathton[u] = true;
    low[u] = disc[u] = tim++;
    for(auto e : adj2[u]) if(e.to != par) {
        if(!visited[e.to]) {
            bridge_det(e.to, u);
            if(low[e.to] > disc[u] && onpathton[e.to]) {
                isbridge[e.id] = true;
            }
        }
        onpathton[u] = onpathton[u] || onpathton[e.to];
        low[u] = min(low[u], low[e.to]);
    }
}
    
int main(int argc, char const *argv[]) {
    cin >> n >> m;
    for(int i = 1; i <= m; i++) {
        cin >> A[i] >> B[i] >> W[i];
        adj[A[i]].push_back({B[i], i});
        adj[B[i]].push_back({A[i], i});
    }
    from1 = get_min_dist(1);
    fromn = get_min_dist(n);
    ll mxw = W[m];
    vector<ll> ans(m+1);
    for(int i = m-1; i >= 1; i--) {
        ll nw = W[i]+mxw;
        ll mndist = inf;
        mndist = min(mndist, from1[A[i]]+fromn[B[i]]+nw);
        mndist = min(mndist, from1[B[i]]+fromn[A[i]]+nw);
        ans[i] = mndist;
        mxw = max(mxw, W[i]);
    }
    // build new graph where every path is min
    for(int i = 1; i <= m; i++) {
        if(from1[A[i]]+fromn[B[i]]+W[i] == from1[n] || from1[B[i]]+fromn[A[i]]+W[i] == from1[n]) {
            adj2[A[i]].push_back({B[i], i});
            adj2[B[i]].push_back({A[i], i});
        }
    }
    // printf("new graph\n");
    // for(int i = 1; i <= n; i++) {
    //     printf("%d: ", i);
    //     for(auto e : adj2[i]) {
    //         printf("%d (%d), ", e.to, e.id);
    //     }
    //     printf("\n");
    // }
    fill(low, low+n+1, mxn);
    bridge_det(1, -1);
    // printf("bridges: ");
    // for(int i = m; i >= 1; i--) if(isbridge[i]) printf("%d ", i);
    // printf("\n");
    vector<int> cnt_to_id(m+1);
    fill(visited, visited+n+1, false);
    queue<int> q;
    visited[1] = true; q.push(1);
    int c = 0;
    while(!q.empty()) {
        int u = q.front(); q.pop();
        for(auto e : adj2[u]) if(!visited[e.to]) {
            visited[e.to] = true;
            c += isbridge[e.id];
            if(isbridge[e.id]) cnt_to_id[c] = e.id;
            q.push(e.to);
        }
    }
    vector<long long> dist(n+1, inf);
    vector<int> cnt(n+1);
    priority_queue<pair<pair<ll, int>, int>> pq;
    vector<Edge> used_edge; vector<int> from;
    dist[1] = 0, cnt[1] = 0;
    pq.push({{-dist[1], 1}, -1});
    vector<vector<ll>> ins(m+1), del(m+1);
    while(!pq.empty()) {
        ll d = -pq.top().first.first;
        int a = pq.top().first.second;
        int edgeidx = pq.top().second;
        pq.pop();
        if(edgeidx != -1) {
            // cerr << from[edgeidx] << " -> " << a << "\n";
            // cerr << cnt[from[edgeidx]]+isbridge[used_edge[edgeidx].id] << "; " << cnt[a] << "\n";
            if(cnt[used_edge[edgeidx].to] > cnt[from[edgeidx]]+isbridge[used_edge[edgeidx].id]) {
                int l = cnt[from[edgeidx]]+isbridge[used_edge[edgeidx].id]+1, r = cnt[a];
                ll val = from1[from[edgeidx]]+W[used_edge[edgeidx].id]+fromn[a];
                // for(int i = l; i <= r; i++) {
                //     // cerr << "modify " << cnt_to_id[i] << "\n";
                //     ans[cnt_to_id[i]] = min(ans[cnt_to_id[i]], val);
                // }
                // cerr << l << "; " << r << ": " << val << "\n";
                ins[l].push_back(val);
                del[r].push_back(val);
            }
        }
        if(dist[a] != d) continue;
        // cerr << a << " " << d << "\n";
        for(auto e : adj[a]) {
            if(dist[e.to] > d+W[e.id]) {
                cnt[e.to] = cnt[a]+isbridge[e.id];
                dist[e.to] = d+W[e.id];
                pq.push({{-dist[e.to], e.to}, used_edge.size()});
                used_edge.push_back(e); from.push_back(a);
                // cerr << "add " << from.back() << " " << used_edge.back().to << "\n";
            }
            else {
                // cerr << a << " -> " << e.to << "\n";
                // cerr << cnt[a]+isbridge[e.id] << "; " << cnt[e.to] << "\n";
                if(cnt[e.to] > cnt[a]+isbridge[e.id]) {
                    int l = cnt[a]+isbridge[e.id]+1, r = cnt[e.to];
                    ll val = from1[a]+W[e.id]+fromn[e.to];
                    // for(int i = l; i <= r; i++)  {
                    //     // cerr << i << ": " << cnt_to_id[i] << "?\n";
                    //     ans[cnt_to_id[i]] = min(ans[cnt_to_id[i]], val);
                    // }
                    // cerr << l << "; " << r << ": " << val << "\n";
                    ins[l].push_back(val);
                    del[r].push_back(val);
                }
            }
        }
    }
    multiset<ll> available;
    for(int i = 0; i <= m; i++) {
        for(ll x : ins[i]) available.insert(x);
        if(cnt_to_id[i] != 0 && !available.empty()) {
            // cerr << cnt_to_id[i] << " <- " << (*available.begin()) << "\n";
            ans[cnt_to_id[i]] = min(ans[cnt_to_id[i]], *available.begin());
        }
        for(ll x : del[i]) available.erase(available.find(x));
    }
    ll answer = 0;
    for(int i = 1; i < m; i++) {
        // cerr << ans[i] << "/" << from1[n] << " (" << (isbridge[i] ? ans[i] : from1[n]) << ") ";
        answer = max(answer, isbridge[i] ? ans[i] : from1[n]);
    }
    // cerr << "\n";
    cout << answer << "\n";
    return 0;
}

Compilation message

Aesthetic.cpp:7:2: warning: #warning change mxn [-Wcpp]
    7 | #warning change mxn
      |  ^~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 8 ms 14336 KB Output is correct
2 Correct 7 ms 14420 KB Output is correct
3 Correct 7 ms 14420 KB Output is correct
4 Correct 7 ms 14420 KB Output is correct
5 Correct 10 ms 14420 KB Output is correct
6 Correct 9 ms 14420 KB Output is correct
7 Correct 7 ms 14448 KB Output is correct
8 Correct 7 ms 14420 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 8 ms 14336 KB Output is correct
2 Correct 7 ms 14420 KB Output is correct
3 Correct 7 ms 14420 KB Output is correct
4 Correct 7 ms 14420 KB Output is correct
5 Correct 10 ms 14420 KB Output is correct
6 Correct 9 ms 14420 KB Output is correct
7 Correct 7 ms 14448 KB Output is correct
8 Correct 7 ms 14420 KB Output is correct
9 Correct 10 ms 14680 KB Output is correct
10 Correct 13 ms 14648 KB Output is correct
11 Correct 9 ms 14676 KB Output is correct
12 Correct 9 ms 14676 KB Output is correct
13 Correct 9 ms 14672 KB Output is correct
14 Correct 11 ms 14608 KB Output is correct
15 Correct 9 ms 14708 KB Output is correct
16 Correct 8 ms 14676 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 715 ms 71284 KB Output is correct
2 Correct 663 ms 71376 KB Output is correct
3 Correct 676 ms 70996 KB Output is correct
4 Correct 732 ms 70972 KB Output is correct
5 Correct 725 ms 71244 KB Output is correct
6 Correct 813 ms 72316 KB Output is correct
7 Correct 680 ms 71996 KB Output is correct
8 Correct 695 ms 72468 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 730 ms 72340 KB Output is correct
2 Correct 696 ms 71620 KB Output is correct
3 Correct 786 ms 70920 KB Output is correct
4 Correct 789 ms 71388 KB Output is correct
5 Correct 767 ms 71336 KB Output is correct
6 Correct 698 ms 71356 KB Output is correct
7 Correct 743 ms 71404 KB Output is correct
8 Correct 769 ms 71912 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 627 ms 62716 KB Output is correct
2 Correct 340 ms 64196 KB Output is correct
3 Correct 365 ms 70608 KB Output is correct
4 Correct 447 ms 70620 KB Output is correct
5 Correct 460 ms 70660 KB Output is correct
6 Correct 409 ms 70724 KB Output is correct
7 Correct 430 ms 70664 KB Output is correct
8 Correct 413 ms 70932 KB Output is correct
9 Correct 436 ms 70656 KB Output is correct
10 Correct 479 ms 71140 KB Output is correct
11 Correct 480 ms 70872 KB Output is correct
12 Correct 630 ms 64684 KB Output is correct
13 Correct 390 ms 70888 KB Output is correct
14 Correct 421 ms 81588 KB Output is correct
15 Correct 261 ms 79328 KB Output is correct
16 Correct 564 ms 62936 KB Output is correct
17 Correct 629 ms 63740 KB Output is correct
18 Correct 559 ms 62492 KB Output is correct
19 Correct 319 ms 64276 KB Output is correct
20 Correct 319 ms 64264 KB Output is correct
21 Correct 307 ms 64284 KB Output is correct
22 Correct 327 ms 64208 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 627 ms 62716 KB Output is correct
2 Correct 340 ms 64196 KB Output is correct
3 Correct 365 ms 70608 KB Output is correct
4 Correct 447 ms 70620 KB Output is correct
5 Correct 460 ms 70660 KB Output is correct
6 Correct 409 ms 70724 KB Output is correct
7 Correct 430 ms 70664 KB Output is correct
8 Correct 413 ms 70932 KB Output is correct
9 Correct 436 ms 70656 KB Output is correct
10 Correct 479 ms 71140 KB Output is correct
11 Correct 480 ms 70872 KB Output is correct
12 Correct 630 ms 64684 KB Output is correct
13 Correct 390 ms 70888 KB Output is correct
14 Correct 421 ms 81588 KB Output is correct
15 Correct 261 ms 79328 KB Output is correct
16 Correct 564 ms 62936 KB Output is correct
17 Correct 629 ms 63740 KB Output is correct
18 Correct 559 ms 62492 KB Output is correct
19 Correct 319 ms 64276 KB Output is correct
20 Correct 319 ms 64264 KB Output is correct
21 Correct 307 ms 64284 KB Output is correct
22 Correct 327 ms 64208 KB Output is correct
23 Correct 857 ms 66528 KB Output is correct
24 Correct 367 ms 66768 KB Output is correct
25 Correct 327 ms 54876 KB Output is correct
26 Correct 412 ms 58228 KB Output is correct
27 Correct 365 ms 56768 KB Output is correct
28 Correct 351 ms 55968 KB Output is correct
29 Correct 419 ms 58708 KB Output is correct
30 Correct 376 ms 56208 KB Output is correct
31 Correct 408 ms 57272 KB Output is correct
32 Correct 415 ms 56896 KB Output is correct
33 Correct 341 ms 55912 KB Output is correct
34 Correct 713 ms 66040 KB Output is correct
35 Correct 383 ms 56492 KB Output is correct
36 Correct 329 ms 93848 KB Output is correct
37 Correct 267 ms 76984 KB Output is correct
38 Correct 663 ms 64952 KB Output is correct
39 Correct 683 ms 65204 KB Output is correct
40 Correct 751 ms 66120 KB Output is correct
41 Correct 352 ms 66752 KB Output is correct
42 Correct 386 ms 66700 KB Output is correct
43 Correct 348 ms 66740 KB Output is correct
44 Correct 371 ms 66724 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 8 ms 14336 KB Output is correct
2 Correct 7 ms 14420 KB Output is correct
3 Correct 7 ms 14420 KB Output is correct
4 Correct 7 ms 14420 KB Output is correct
5 Correct 10 ms 14420 KB Output is correct
6 Correct 9 ms 14420 KB Output is correct
7 Correct 7 ms 14448 KB Output is correct
8 Correct 7 ms 14420 KB Output is correct
9 Correct 10 ms 14680 KB Output is correct
10 Correct 13 ms 14648 KB Output is correct
11 Correct 9 ms 14676 KB Output is correct
12 Correct 9 ms 14676 KB Output is correct
13 Correct 9 ms 14672 KB Output is correct
14 Correct 11 ms 14608 KB Output is correct
15 Correct 9 ms 14708 KB Output is correct
16 Correct 8 ms 14676 KB Output is correct
17 Correct 715 ms 71284 KB Output is correct
18 Correct 663 ms 71376 KB Output is correct
19 Correct 676 ms 70996 KB Output is correct
20 Correct 732 ms 70972 KB Output is correct
21 Correct 725 ms 71244 KB Output is correct
22 Correct 813 ms 72316 KB Output is correct
23 Correct 680 ms 71996 KB Output is correct
24 Correct 695 ms 72468 KB Output is correct
25 Correct 730 ms 72340 KB Output is correct
26 Correct 696 ms 71620 KB Output is correct
27 Correct 786 ms 70920 KB Output is correct
28 Correct 789 ms 71388 KB Output is correct
29 Correct 767 ms 71336 KB Output is correct
30 Correct 698 ms 71356 KB Output is correct
31 Correct 743 ms 71404 KB Output is correct
32 Correct 769 ms 71912 KB Output is correct
33 Correct 627 ms 62716 KB Output is correct
34 Correct 340 ms 64196 KB Output is correct
35 Correct 365 ms 70608 KB Output is correct
36 Correct 447 ms 70620 KB Output is correct
37 Correct 460 ms 70660 KB Output is correct
38 Correct 409 ms 70724 KB Output is correct
39 Correct 430 ms 70664 KB Output is correct
40 Correct 413 ms 70932 KB Output is correct
41 Correct 436 ms 70656 KB Output is correct
42 Correct 479 ms 71140 KB Output is correct
43 Correct 480 ms 70872 KB Output is correct
44 Correct 630 ms 64684 KB Output is correct
45 Correct 390 ms 70888 KB Output is correct
46 Correct 421 ms 81588 KB Output is correct
47 Correct 261 ms 79328 KB Output is correct
48 Correct 564 ms 62936 KB Output is correct
49 Correct 629 ms 63740 KB Output is correct
50 Correct 559 ms 62492 KB Output is correct
51 Correct 319 ms 64276 KB Output is correct
52 Correct 319 ms 64264 KB Output is correct
53 Correct 307 ms 64284 KB Output is correct
54 Correct 327 ms 64208 KB Output is correct
55 Correct 857 ms 66528 KB Output is correct
56 Correct 367 ms 66768 KB Output is correct
57 Correct 327 ms 54876 KB Output is correct
58 Correct 412 ms 58228 KB Output is correct
59 Correct 365 ms 56768 KB Output is correct
60 Correct 351 ms 55968 KB Output is correct
61 Correct 419 ms 58708 KB Output is correct
62 Correct 376 ms 56208 KB Output is correct
63 Correct 408 ms 57272 KB Output is correct
64 Correct 415 ms 56896 KB Output is correct
65 Correct 341 ms 55912 KB Output is correct
66 Correct 713 ms 66040 KB Output is correct
67 Correct 383 ms 56492 KB Output is correct
68 Correct 329 ms 93848 KB Output is correct
69 Correct 267 ms 76984 KB Output is correct
70 Correct 663 ms 64952 KB Output is correct
71 Correct 683 ms 65204 KB Output is correct
72 Correct 751 ms 66120 KB Output is correct
73 Correct 352 ms 66752 KB Output is correct
74 Correct 386 ms 66700 KB Output is correct
75 Correct 348 ms 66740 KB Output is correct
76 Correct 371 ms 66724 KB Output is correct
77 Correct 708 ms 68608 KB Output is correct
78 Correct 423 ms 68636 KB Output is correct
79 Correct 430 ms 61076 KB Output is correct
80 Correct 496 ms 60528 KB Output is correct
81 Correct 438 ms 60752 KB Output is correct
82 Correct 432 ms 60796 KB Output is correct
83 Correct 480 ms 60788 KB Output is correct
84 Correct 625 ms 59984 KB Output is correct
85 Correct 526 ms 61368 KB Output is correct
86 Correct 415 ms 60972 KB Output is correct
87 Correct 449 ms 60556 KB Output is correct
88 Correct 702 ms 67532 KB Output is correct
89 Correct 450 ms 61260 KB Output is correct
90 Correct 342 ms 94492 KB Output is correct
91 Correct 339 ms 77632 KB Output is correct
92 Correct 738 ms 69156 KB Output is correct
93 Correct 775 ms 66912 KB Output is correct
94 Correct 621 ms 66284 KB Output is correct
95 Correct 394 ms 68844 KB Output is correct
96 Correct 421 ms 68676 KB Output is correct
97 Correct 385 ms 68732 KB Output is correct
98 Correct 410 ms 68664 KB Output is correct