제출 #1335564

#제출 시각아이디문제언어결과실행 시간메모리
1335564MunkhErdene사이버랜드 (APIO23_cyberland)C++17
97 / 100
1053 ms2162688 KiB
#include "cyberland.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define ff first
#define ss second
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
#define ull unsigned long long
#define lll __int128
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define BlueCrowner ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define FOR(i, a, b) for (ll i = (a); i < (b); i++)
#define FORD(i, a, b) for (ll i = (a); i >= (b); i--)
const ll mod = 1e9 + 7;
const ll mod1 = 998244353;
const ll naim = 1e9;
const ll max_bit = 60;
const ull tom = ULLONG_MAX;
const ll MAXN = 100005;
const ll LOG = 20;
const ll NAIM = 1e18;
const ll N = 2e6 + 5;
double solve(int N, int M, int K, int H, vector<int> x, vector<int> y, vector<int> c, vector<int> arr) {
    ll n = N, m = M, k = K, h = H;
    vector<vector<pair<ll, ll>>> g(n);
    FOR(i, 0, m) {
        ll u = x[i], v = y[i], w = c[i];
        g[u].pb({v, w});
        g[v].pb({u, w});
    }
    vector<vector<double>> dp(k + 1, vector<double>(n, NAIM));
    dp[0][0] = 0;
    double ans = NAIM;
    FOR(i, 0, k + 1) {
        priority_queue<pair<double, ll>, vector<pair<double, ll>>, greater<pair<double, ll>>> pq;
        FOR(j, 0, n) if(dp[i][j] < NAIM) pq.push({dp[i][j], j});
        while(!pq.empty()) {
            auto [d, u] = pq.top(); pq.pop();
            if(d > dp[i][u] || u == h) continue;
            for(auto &[v, d1] : g[u]) {
                if(arr[v] == 2) {
                    if(i < k) {
                        if((double)(dp[i][u] + d1) / 2.0 < dp[i + 1][v]) {
                            dp[i + 1][v] = (double)(dp[i][u] + d1) / 2.0;
                        }
                    }
                }

                if(arr[v] == 0) {
                    if(dp[i][v] > 0) {
                        dp[i][v] = 0;
                        pq.push({0, v});
                    }
                }
                else if(dp[i][u] + d1 < dp[i][v]) {
                    dp[i][v] = dp[i][u] + d1;
                    pq.push({dp[i][v], v});
                }
            }
        }
    }
    FOR(i, 0, k + 1) ans = min(ans, dp[i][h]);
    return (ans >= 1e17 ? -1 : 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...