답안 #770177

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
770177 2023-06-30T22:40:58 Z gg123_pe 사이버랜드 (APIO23_cyberland) C++17
97 / 100
661 ms 68316 KB
#include <bits/stdc++.h> 
#include "cyberland.h"

using namespace std; 

#define f(i,a,b) for(int i = a; i < b; i++)
typedef pair <double, pair<int, int>> ii; 

const int N = 1e5 + 5; 
const double inf = 2e15; 

int n, k; 
double d[N][71]; 
bool vis[N]; 
vector <pair<int, double>> adj[N], adj_H; 
vector <int> ARR; 

void check(int u){
    vis[u] = 1; 
    for(auto p: adj[u]){
        int v = p.first; 
        if(!vis[v]) check(v); 
    }
}
void clear(){
    adj_H.clear(); ARR.clear();  
    f(i,0,n) adj[i].clear(), vis[i] = 0;
}
void dij(){
    priority_queue <ii, vector <ii>, greater <ii>> q; 
    f(i,0,n) {
        f(j,0,k+1) d[i][j] = inf; 
        if((ARR[i] == 0 or i == 0) and vis[i]){
            f(j,0,k+1) {
                d[i][j] = 0; 
                q.push({0, {j, i}}); 
            }
        }
    }

    while(!q.empty()){
        auto pa = q.top(); q.pop(); 
        double d_u = pa.first; int u = pa.second.second; int c = pa.second.first;  

        if(d[u][c] != d_u) continue; 
        for(auto p: adj[u]){
            int v = p.first; double w = p.second; 
            if(d[v][c] > d[u][c] + w){
                d[v][c] = d[u][c] + w; 
                q.push({d[v][c], {c, v}}); 
            }
            if(ARR[v] == 2 and c+1 <= k){
                double val = (d[u][c] + w) / 2;  
                if(d[v][c+1] > val){
                    d[v][c+1] = val; 
                    q.push({d[v][c+1], {c+1, v}}); 
                }
            }
        }
    }
}
double solve(int Ni, int M, int K, int H, vector<int> x, vector<int> y, vector<int> c, vector<int> arr) {
    n = Ni; 
    ARR = arr; 
    k = min(60, K); 

    f(i,0,M){
        if(x[i] == H or y[i] == H){
            adj_H.push_back({x[i] + y[i] - H, c[i]}); 
        }
        else {
            adj[x[i]].push_back({y[i], c[i]}); 
            adj[y[i]].push_back({x[i], c[i]}); 
        }
    }
    check(0); 
    dij(); 
    
    double ans = inf; 
    for(auto p: adj_H) {
        int v = p.first; double w = p.second; 
        if(vis[v]) f(i,0,k+1) ans = min(ans, d[v][i] + w); 
    }
    clear(); 
    return (ans == inf) ? -1 : ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 2772 KB Correct.
2 Correct 26 ms 2772 KB Correct.
# 결과 실행 시간 메모리 Grader output
1 Correct 194 ms 3604 KB Correct.
2 Correct 219 ms 3616 KB Correct.
3 Correct 207 ms 3560 KB Correct.
4 Correct 217 ms 3616 KB Correct.
5 Correct 215 ms 3596 KB Correct.
6 Correct 206 ms 10564 KB Correct.
7 Correct 262 ms 10432 KB Correct.
8 Correct 114 ms 17344 KB Correct.
9 Correct 172 ms 2808 KB Correct.
10 Correct 171 ms 2796 KB Correct.
# 결과 실행 시간 메모리 Grader output
1 Correct 262 ms 3860 KB Correct.
2 Correct 258 ms 3824 KB Correct.
3 Correct 238 ms 3900 KB Correct.
4 Correct 216 ms 2824 KB Correct.
5 Correct 202 ms 2828 KB Correct.
6 Correct 54 ms 9924 KB Correct.
# 결과 실행 시간 메모리 Grader output
1 Correct 195 ms 42984 KB Correct.
2 Correct 227 ms 3740 KB Correct.
3 Correct 195 ms 3716 KB Correct.
4 Correct 211 ms 3764 KB Correct.
5 Correct 177 ms 2772 KB Correct.
# 결과 실행 시간 메모리 Grader output
1 Correct 126 ms 3648 KB Correct.
2 Correct 120 ms 3716 KB Correct.
3 Correct 130 ms 3676 KB Correct.
4 Correct 132 ms 11060 KB Correct.
5 Correct 94 ms 2824 KB Correct.
# 결과 실행 시간 메모리 Grader output
1 Correct 151 ms 3872 KB Correct.
2 Correct 120 ms 3896 KB Correct.
3 Correct 62 ms 51508 KB Correct.
4 Correct 91 ms 10948 KB Correct.
5 Correct 116 ms 2836 KB Correct.
6 Correct 131 ms 3908 KB Correct.
# 결과 실행 시간 메모리 Grader output
1 Correct 209 ms 3920 KB Correct.
2 Correct 31 ms 4696 KB Correct.
3 Correct 541 ms 66116 KB Correct.
4 Correct 490 ms 17788 KB Correct.
5 Correct 661 ms 45772 KB Correct.
6 Correct 247 ms 22596 KB Correct.
7 Correct 475 ms 18968 KB Correct.
8 Correct 499 ms 5184 KB Correct.
9 Correct 173 ms 3916 KB Correct.
10 Correct 177 ms 4036 KB Correct.
11 Correct 473 ms 3804 KB Correct.
12 Correct 198 ms 4020 KB Correct.
13 Correct 194 ms 3980 KB Correct.
14 Correct 375 ms 34284 KB Correct.
15 Correct 450 ms 11480 KB Correct.
16 Correct 176 ms 3932 KB Correct.
17 Correct 216 ms 4040 KB Correct.
18 Correct 208 ms 3872 KB Correct.
19 Correct 548 ms 3864 KB Correct.
20 Correct 15 ms 2772 KB Correct.
21 Correct 15 ms 3572 KB Correct.
22 Correct 21 ms 4944 KB Correct.
# 결과 실행 시간 메모리 Grader output
1 Correct 504 ms 4940 KB Correct.
2 Correct 60 ms 5596 KB Correct.
3 Incorrect 551 ms 68316 KB Wrong Answer.
4 Halted 0 ms 0 KB -