Submission #1037388

#TimeUsernameProblemLanguageResultExecution timeMemory
1037388aaaaaarrozCyberland (APIO23_cyberland)C++17
100 / 100
118 ms74836 KiB
#include "cyberland.h" #include <bits/stdc++.h> using namespace std; void dfs(int x , vector<bool>&reach , vector<vector<pair<int ,int>>> &adj , int H){ if(x == H || reach[x]){ return; } reach[x] = 1; for(auto [u , cost] : adj[x]){ dfs(u , reach , adj , H); } } using Node = tuple<double , int , int>; priority_queue<Node , vector<Node> , greater<Node>> pq; void upd(int x , int k , double d , vector<vector<double>> &dist){ if(dist[x][k] > d){ dist[x][k] = d; pq.push({d , x , k}); } } 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){ pq = priority_queue<Node , vector<Node> , greater<Node>> (); K = min(K , 70); vector<vector<pair<int , int>>> adj(N); vector<bool> reach(N); vector<double> pwr(K + 1); pwr[0] = 1; for(int i = 1 ; i <= K ; i++){ pwr[i] = pwr[i - 1]/2.0; } 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]}); } vector<vector<double>> dist(N , vector<double>(K + 1 , 1e18)); arr[0] = 0; upd(H , 0 , 0 , dist); dfs(0 , reach ,adj ,H); while(!pq.empty()){ auto [d , x , k] = pq.top(); pq.pop(); if(arr[x] == 0){ return d; } for(auto [u , cost] : adj[x]){ if(!reach[u]) continue; upd(u , k , cost*pwr[k] + d , dist); if(arr[x] == 2 && k < K){ int p = k + 1; upd(u , p , cost*pwr[p] + d , dist); } } } return -1; }
#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...