Submission #957557

#TimeUsernameProblemLanguageResultExecution timeMemory
957557abczzCyberland (APIO23_cyberland)C++17
100 / 100
1949 ms140928 KiB
#include "cyberland.h"
#include <iostream>
#include <vector>
#include <queue>
#include <array>
#define ll long long
#define ld long double

using namespace std;

vector <array<ll, 2>> adj[100000];
ll h;
bool visited[100000];
priority_queue<array<ld, 2>, vector<array<ld, 2>>, greater<array<ld, 2>>> pq[81];
ld dp[100000][81], ep = 1e-9;

void dfs(ll u) {
    visited[u] = 1;
    for (auto [v, x] : adj[u]) {
        if (v != h && !visited[v]) {
            dfs(v);
        }
    }
}
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) {
    K = min(K, 80), h = H;
    for (int i=0; i<N; ++i) {
        visited[i] = 0;
        adj[i].clear();
        for (int j=0; j<=K; ++j) {
            dp[i][j] = 1e18;
        }
    }
    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]});
    }
    dfs(0);
    for (int i=0; i<N; ++i) {
        if (visited[i] && (!arr[i] || !i)) {
            dp[i][K] = 0;
            pq[K].push({0, (ld)i});
        }
    }
    for (int i=K; i>=0; --i) {
        while (!pq[i].empty()) {
            auto [w, du] = pq[i].top();
            pq[i].pop();
            ll u = (ll)du;
            if (dp[u][i] != w || u == H) continue;
            for (auto [v, x] : adj[u]) {
                if (dp[v][i]-(w+(ld)x) > ep) {
                    dp[v][i] = w+(ld)x;
                    pq[i].push({dp[v][i], (ld)v});
                }
                if (i && arr[v] == 2 && (dp[v][i-1]-(ld)(w+(ld)x)/2) > ep) {
                    dp[v][i-1] = (w+(ld)x)/2;
                    pq[i-1].push({dp[v][i-1], (ld)v});
                }
            }
        }
    }
    ld f = 1e18;
    for (int i=0; i<=K; ++i) {
        f = min(f, dp[H][i]);
    }
    if (f == 1e18) return -1;
    return f;
}
#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...