제출 #805398

#제출 시각아이디문제언어결과실행 시간메모리
805398Theo830사이버랜드 (APIO23_cyberland)C++17
97 / 100
881 ms59812 KiB
    #include "cyberland.h"
    #include <bits/stdc++.h>
    using namespace std;
    #define f(i,a,b) for(int i = a;i < b;i++)
    #define ll long long
    #define ii pair<ll,ll>
    #define id pair<double,ll>
    #define F first
    #define S second
    #define pb push_back
    priority_queue<id,vector<id>,greater<id> >pq;
    bool v[100005] = {0};
    double dist[100005][60];
    vector<vector<ii> >adj;
    ll H;
    void dfs(ll idx){
        v[idx] = 1;
        for(auto x:adj[idx]){
            if(!v[x.F] && x.F != H){
                dfs(x.F);
            }
        }
    }
    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) {
        double ans;
        H = h;
        adj.assign(n+5,vector<ii>());
        k = min(k,50);
        f(i,0,n){
            v[i] = 0;
            f(j,0,k+1){
                dist[i][j] = 1e18;
            }
        }
        f(i,0,m){
            adj[x[i]].pb(ii(y[i],c[i]));
            adj[y[i]].pb(ii(x[i],c[i]));
        }
        dfs(0);
        f(i,0,n){
            if((arr[i] == 0 && v[i]) || i == 0){
                pq.push(id(0,(k+1) * i));
                dist[i][0] = 0;
            }
        }
        ans = 1e18;
        if(k <= 30){
            while(!pq.empty()){
                id f = pq.top();
                pq.pop();
                double w = f.F;
                ll u = f.S / (k+1);
                ll ek = f.S % (k+1);
                if(dist[u][ek] < w){
                    continue;
                }
                if(arr[u] == 2 && ek+1 <= k){
                    for(auto x:adj[u]){
                        if(x.F == h){
                            ans = min(ans,dist[u][ek]/(double)2 + (double)x.S);
                        }
                        else if(dist[x.F][ek+1] > dist[u][ek]/(double)2 + (double)x.S){
                            dist[x.F][ek+1] = dist[u][ek]/(double)2 + (double)x.S;
                            pq.push(id(dist[x.F][ek+1],(k+1) * x.F + ek+1));
                        }
                    }
                }
                for(auto x:adj[u]){
                    if(x.F == h){
                        ans = min(ans,dist[u][ek] + x.S);
                    }
                    else if(dist[x.F][ek] > dist[u][ek] + x.S){
                        dist[x.F][ek] = dist[u][ek] + x.S;
                        pq.push(id(dist[x.F][ek],(k+1) * x.F + ek));
                    }
                }
            }
        }
        else{
            while(!pq.empty()){
                id f = pq.top();
                pq.pop();
                double w = f.F;
                ll u = f.S / (k+1);
                ll ek = f.S % (k+1);
                if(dist[u][ek] < w){
                    continue;
                }
                if(arr[u] == 2 && ek == 0){
                    for(auto x:adj[u]){
                        if(x.F == h){
                            ans = min(ans,dist[u][ek]/(double)2 + (double)x.S);
                        }
                        else if(dist[x.F][ek+1] > (double)x.S){
                            dist[x.F][ek+1] = (double)x.S;
                            pq.push(id(dist[x.F][ek+1],(k+1) * x.F + ek+1));
                        }
                    }
                }
                for(auto x:adj[u]){
                    if(x.F == h){
                        ans = min(ans,dist[u][ek] + x.S);
                    }
                    else if(dist[x.F][ek] > dist[u][ek] + x.S){
                        dist[x.F][ek] = dist[u][ek] + x.S;
                        pq.push(id(dist[x.F][ek],(k+1) * x.F + ek));
                    }
                }
            }
        }
        if(ans == 1e18){
            ans = -1;
        }
        return ans;
    }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...