Submission #751175

# Submission time Handle Problem Language Result Execution time Memory
751175 2023-05-31T07:18:32 Z Hona_Nguyen Cyberland (APIO23_cyberland) C++17
97 / 100
1330 ms 137344 KB
#include "cyberland.h"

#include <bits/stdc++.h>
#pragma GCC optimize "Ofast"
using namespace std;


double sub_2_5(int N, int M, int K, int H, std::vector<int> x, std::vector<int> y, std::vector<int> c, std::vector<int> arr){
    struct ii{
        int id;
        double w;
    };
    struct cmp{
        bool operator () (ii A, ii B){
            return A.w > B.w;
        }
    };

    priority_queue<ii, vector<ii>, cmp> pq;

    vector<double> dp(N, (double)(1e15));
    vector<vector<pair<int,int>>> G(N);

    for(int i=0;i<M;i++){
        G[x[i]].push_back({y[i], c[i]});
        G[y[i]].push_back({x[i], c[i]});
    }

    dp[0] = 0;
    pq.push({0,dp[0]});

    while(pq.size()){
        ii u = pq.top();
        pq.pop();
        if(dp[u.id] < u.w) continue;
        for(pair<int,int> v: G[u.id]){
            if(dp[u.id] + v.second < dp[v.first]){
                dp[v.first] = dp[u.id] + v.second;
                pq.push({v.first, dp[v.first]});
            }
        }
    }
    if(dp[H] == (double)(1e15)) dp[H] = -1;
    return dp[H];
}

double sub_3_6(int N, int M, int K, int H, std::vector<int> x, std::vector<int> y, std::vector<int> c, std::vector<int> arr){
    struct ii{
        int id;
        double w;
    };
    struct cmp{
        bool operator () (ii A, ii B){
            return A.w > B.w;
        }
    };

    priority_queue<ii, vector<ii>, cmp> pq;

    vector<double> dp(N, (double)(1e15));
    vector<vector<pair<int,int>>> G(N);

    for(int i=0;i<M;i++){
        G[x[i]].push_back({y[i], c[i]});
        G[y[i]].push_back({x[i], c[i]});
    }

    dp[0] = 0;
    pq.push({0,dp[0]});

    vector<bool> vis(N,false);
    queue<int> Q;
    Q.push(0);
    vis[0] = true;

    while(Q.size()){
        int u = Q.front();
        Q.pop();
        for(pair<int,int> v: G[u]){
            if(vis[v.first] == true || v.first == H) continue;
            vis[v.first] = true;
            Q.push(v.first);
        }
    }

    for(int i=1;i<N;i++){
        if(arr[i] == 0 && vis[i] == true){
            dp[i] = 0;
            pq.push({i,dp[i]});
        }
    }

    while(pq.size()){
        ii u = pq.top();
        pq.pop();
        if(dp[u.id] < u.w) continue;
        for(pair<int,int> v: G[u.id]){
            if(dp[u.id] + v.second < dp[v.first]){
                dp[v.first] = dp[u.id] + v.second;
                pq.push({v.first, dp[v.first]});
            }
        }
    }
    if(dp[H] == (double)(1e15)) dp[H] = -1;
    return dp[H];
}

double sub_1_4_7(int N, int M, int K, int H, std::vector<int> x, std::vector<int> y, std::vector<int> c, std::vector<int> arr){
    struct ii{
        int id;
        int div2;
        double w;
    };
    struct cmp{
        bool operator () (ii A, ii B){
            return A.w > B.w;
        }
    };

    priority_queue<ii, vector<ii>, cmp> pq;

    vector<vector<double>> dp(N, vector<double> (K+2, (double)(1e15)));
    vector<vector<pair<int,int>>> G(N);

    for(int i=0;i<M;i++){
        G[x[i]].push_back({y[i], c[i]});
        G[y[i]].push_back({x[i], c[i]});
    }

    dp[0][0] = 0;
    pq.push({0,0,dp[0][0]});

    vector<bool> vis(N,false);
    queue<int> Q;
    Q.push(0);
    vis[0] = true;

    while(Q.size()){
        int u = Q.front();
        Q.pop();
        for(pair<int,int> v: G[u]){
            if(vis[v.first] == true || v.first == H) continue;
            vis[v.first] = true;
            Q.push(v.first);
        }
    }

    for(int i=1;i<N;i++){
        if(arr[i] == 0 && vis[i] == true){
            dp[i][0] = 0;
            pq.push({i,0,dp[i][0]});
        }
    }

    while(pq.size()){
        ii u = pq.top();
        pq.pop();
        if(dp[u.id][u.div2] < u.w) continue;
        if(u.id == H) continue;
        for(pair<int,int> v: G[u.id]){
            if(dp[u.id][u.div2] + v.second < dp[v.first][u.div2]){
                dp[v.first][u.div2] = dp[u.id][u.div2] + v.second;
                pq.push({v.first, u.div2, dp[v.first][u.div2]});
            }
            double tmp = (dp[u.id][u.div2] + v.second) / 2.0;
            if(u.div2 + 1 <= K && arr[v.first] == 2){
                if(tmp < dp[v.first][u.div2+1]){
                    dp[v.first][u.div2+1] = tmp;
                    pq.push({v.first, u.div2+1, dp[v.first][u.div2+1]});
                }
            }
        }
    }

    double ans = (double)(1e15);
    for(int i=0;i<=K;i++) ans = min(ans, dp[H][i]);
    if(ans == (double)(1e15)) ans = -1;
    return ans;
}

double sub_8(int N, int M, int K, int H, std::vector<int> x, std::vector<int> y, std::vector<int> c, std::vector<int> arr){
    struct ii{
        int id;
        int div2;
        double w;
    };
    struct cmp{
        bool operator () (ii A, ii B){
            return A.w > B.w;
        }
    };

    priority_queue<ii, vector<ii>, cmp> pq;

    vector<vector<double>> dp(N, vector<double> (K+2, (double)(1e15)));
    vector<vector<int>> vis_go(N, vector<int> (K+2, 0));
    vector<vector<pair<int,int>>> G(N);

    for(int i=0;i<M;i++){
        G[x[i]].push_back({y[i], c[i]});
        G[y[i]].push_back({x[i], c[i]});
    }

    dp[0][0] = 0;
    pq.push({0,0,dp[0][0]});
    vis_go[0][0] = 1;

    vector<bool> vis(N,false);
    queue<int> Q;
    Q.push(0);
    vis[0] = true;

    while(Q.size()){
        int u = Q.front();
        Q.pop();
        for(pair<int,int> v: G[u]){
            if(vis[v.first] == true || v.first == H) continue;
            vis[v.first] = true;
            Q.push(v.first);
        }
    }

    for(int i=1;i<N;i++){
        if(arr[i] == 0 && vis[i] == true){
            dp[i][0] = 0;
            vis_go[i][0] = 1;
            pq.push({i,0,dp[i][0]});
        }
    }

    while(pq.size()){
        ii u = pq.top();
        pq.pop();
        if(dp[u.id][u.div2] < u.w) continue;
        if(u.id == H) continue;
        for(pair<int,int> v: G[u.id]){
            if(dp[u.id][u.div2] + v.second < dp[v.first][u.div2] && vis_go[v.first][u.div2+1] < 50){
                dp[v.first][u.div2] = dp[u.id][u.div2] + v.second;
                vis_go[v.first][u.div2]++;
                pq.push({v.first, u.div2, dp[v.first][u.div2]});
            }
            double tmp = (dp[u.id][u.div2] + v.second) / 2.0;
            if(u.div2 + 1 <= K && arr[v.first] == 2){
                if(tmp < dp[v.first][u.div2+1] && vis_go[v.first][u.div2+1] < 50){
                    dp[v.first][u.div2+1] = tmp;
                    vis_go[v.first][u.div2+1]++;
                    pq.push({v.first, u.div2+1, dp[v.first][u.div2+1]});
                }
            }
        }
    }

    double ans = (double)(1e15);
    for(int i=0;i<=K;i++) ans = min(ans, dp[H][i]);
    if(ans == (double)(1e15)) ans = -1;
    return ans;
}

double solve(int N, int M, int K, int H, std::vector<int> x, std::vector<int> y, std::vector<int> c, std::vector<int> arr){
    int check_sub_2_5 = 0;
    for(int i=0;i<N;i++) check_sub_2_5 += (arr[i] == 1);
    if(check_sub_2_5 == N) return sub_2_5(N,M,K,H,x,y,c,arr);

    int check_sub_3_6 = 0;
    for(int i=0;i<N;i++) check_sub_3_6 += (arr[i] != 2);
    if(check_sub_3_6 == N) return sub_3_6(N,M,K,H,x,y,c,arr);

    if(K <= 30) return sub_1_4_7(N,M,K,H,x,y,c,arr);

    return sub_8(N,M,min(K,100),H,x,y,c,arr);
}
# Verdict Execution time Memory Grader output
1 Correct 23 ms 468 KB Correct.
2 Correct 23 ms 412 KB Correct.
# Verdict Execution time Memory Grader output
1 Correct 22 ms 468 KB Correct.
2 Correct 28 ms 460 KB Correct.
3 Correct 27 ms 468 KB Correct.
4 Correct 29 ms 572 KB Correct.
5 Correct 28 ms 468 KB Correct.
6 Correct 23 ms 1404 KB Correct.
7 Correct 31 ms 1456 KB Correct.
8 Correct 15 ms 2660 KB Correct.
9 Correct 27 ms 340 KB Correct.
10 Correct 27 ms 340 KB Correct.
# Verdict Execution time Memory Grader output
1 Correct 28 ms 444 KB Correct.
2 Correct 29 ms 484 KB Correct.
3 Correct 25 ms 508 KB Correct.
4 Correct 27 ms 392 KB Correct.
5 Correct 28 ms 380 KB Correct.
6 Correct 6 ms 1364 KB Correct.
# Verdict Execution time Memory Grader output
1 Correct 267 ms 27280 KB Correct.
2 Correct 290 ms 1092 KB Correct.
3 Correct 260 ms 1168 KB Correct.
4 Correct 272 ms 1220 KB Correct.
5 Correct 237 ms 440 KB Correct.
# Verdict Execution time Memory Grader output
1 Correct 23 ms 504 KB Correct.
2 Correct 26 ms 432 KB Correct.
3 Correct 25 ms 476 KB Correct.
4 Correct 23 ms 1512 KB Correct.
5 Correct 22 ms 352 KB Correct.
# Verdict Execution time Memory Grader output
1 Correct 25 ms 468 KB Correct.
2 Correct 23 ms 480 KB Correct.
3 Correct 44 ms 9080 KB Correct.
4 Correct 15 ms 1200 KB Correct.
5 Correct 25 ms 384 KB Correct.
6 Correct 24 ms 468 KB Correct.
# Verdict Execution time Memory Grader output
1 Correct 309 ms 1496 KB Correct.
2 Correct 42 ms 2372 KB Correct.
3 Correct 732 ms 29872 KB Correct.
4 Correct 569 ms 7968 KB Correct.
5 Correct 1176 ms 49984 KB Correct.
6 Correct 529 ms 41328 KB Correct.
7 Correct 538 ms 8168 KB Correct.
8 Correct 536 ms 1792 KB Correct.
9 Correct 263 ms 2064 KB Correct.
10 Correct 266 ms 1528 KB Correct.
11 Correct 526 ms 1016 KB Correct.
12 Correct 274 ms 1656 KB Correct.
13 Correct 295 ms 1596 KB Correct.
14 Correct 474 ms 10980 KB Correct.
15 Correct 516 ms 3432 KB Correct.
16 Correct 276 ms 1544 KB Correct.
17 Correct 325 ms 1612 KB Correct.
18 Correct 324 ms 1512 KB Correct.
19 Correct 768 ms 1628 KB Correct.
20 Correct 23 ms 724 KB Correct.
21 Correct 22 ms 1064 KB Correct.
22 Correct 36 ms 3268 KB Correct.
# Verdict Execution time Memory Grader output
1 Correct 1330 ms 5232 KB Correct.
2 Correct 173 ms 8856 KB Correct.
3 Correct 944 ms 137344 KB Correct.
4 Incorrect 1189 ms 8628 KB Wrong Answer.
5 Halted 0 ms 0 KB -