제출 #1365463

#제출 시각아이디문제언어결과실행 시간메모리
1365463nathlol2Cyberland (APIO23_cyberland)C++20
27 / 100
921 ms74276 KiB
#include "cyberland.h"
#include <bits/stdc++.h>
#define ll long double
using namespace std;
const int nx = 1e5 + 5, kx = 68;
const ll INF = 4e18;
bool vis[nx];
ll dist[nx][kx];
vector<pair<int, ll>> adj[nx];
priority_queue<tuple<ll, int, int>, vector<tuple<ll, int, int>>, greater<tuple<ll, int, int>>> pq;
queue<int> q;

double solve(int N, int M, int K, int H, vector<int> x, vector<int> y, vector<int> c, vector<int> arr) {
    K = min(K, 67);
    for(int i = 0;i<M;i++) adj[x[i]].push_back({y[i], c[i]}), adj[y[i]].push_back({x[i], c[i]});
    for(int i = 0;i<N;i++) for(int j = 0;j<kx;j++) dist[i][j] = INF;
    q.push(0);
    while(!q.empty()){
        int u = q.front();
        q.pop();
        if(u == H) continue;
        for(auto [v, w] : adj[u]){
            if(!vis[v]){
                vis[v] = 1;
                q.push(v);
            }
        }
    }
    if(!vis[H]) return -1;
    bool f = 0;
    for(int i = 0;i<N;i++){
        if(arr[i] == 0 && vis[i]){
            f = 1;
            dist[i][0] = 0;
            pq.push({0, 0, i});
        }
    }
    if(!f) pq.push({0, 0, 0}), dist[0][0] = 0;
    ll mn = INF;
    while(!pq.empty()){
        auto [d, k, u] = pq.top();
        pq.pop();
        if(d > dist[u][k] || u == H) continue;
        for(auto [v, w] : adj[u]){
            if(arr[v] == 2){
                if(k + 1 <= K && (d + w) / 2.0L < dist[v][k + 1]){
                    dist[v][k + 1] = (d + w) / 2.0L;
                    pq.push({(d + w) / 2.0L, k + 1, v});
                }
                if(d + w < dist[v][k]){
                    dist[v][k] = d + w;
                    pq.push({d + w, k, v});
                }
            }else if(arr[v] == 1){
                if(d + w < dist[v][k]){
                    dist[v][k] = d + w;
                    pq.push({d + w, k, v});
                }
            }
        }
    }
    for(int i = 0;i<=K;i++) mn = min(mn, dist[H][i]);
    for(int i = 0;i<N;i++) vis[i] = 0, adj[i].clear();
    return mn;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…