Submission #1271161

#TimeUsernameProblemLanguageResultExecution timeMemory
1271161abdelhakimCyberland (APIO23_cyberland)C++20
100 / 100
1178 ms24704 KiB
#include "cyberland.h" #include <bits/stdc++.h> #define ll long long #define inf 1e18 #define dbg(x) cerr<<#x<<' '<<x<<endl; using namespace std; vector<bool> vis; vector<ll> zeros; vector<ll> tws; vector<vector<pair<ll,long double>>> adj; void dfs(ll node, vector<int>& arr, ll h) { vis[node]=true; if(node==h) return; if(arr[node]==0) zeros.push_back(node); else if(arr[node]==2) tws.push_back(node); for (auto &&e : adj[node]) { if(!vis[e.first]) { dfs(e.first,arr,h); } } } 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) { vis.assign(N,false); adj.assign(N,vector<pair<ll,long double>>()); zeros.clear(); tws.clear(); zeros.push_back(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]}); } dfs(0,arr,H); if(!vis[H]) return -1; vector<long double> dist(N,inf); priority_queue<pair<long double,int>,vector<pair<long double,int>>,greater<pair<long double,int>>> pq; for (auto &&e : zeros) { dist[e]=0; pq.push({0,e}); } auto dij=[&]() { while(!pq.empty()) { ll nd=pq.top().second; pq.pop(); for (auto &&e : adj[nd]) { if(dist[e.first] > dist[nd]+e.second) { dist[e.first]=dist[nd]+e.second; if(e.first!=H)pq.push({dist[e.first],e.first}); } } } }; dij(); for (int i=0;i<min(70,K);i++) { vector<long double> prev=dist; for (auto &&e : tws) { long double val = prev[e]/2; for (auto &&ei : adj[e]) { dist[ei.first]=min(dist[ei.first],val+ei.second); if(ei.first!=H) pq.push({dist[ei.first],ei.first}); } } dij(); } return dist[H]; }
#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...