Submission #1195464

#TimeUsernameProblemLanguageResultExecution timeMemory
1195464Shadow1Cyberland (APIO23_cyberland)C++20
100 / 100
1422 ms136644 KiB
#include "cyberland.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; #define show(x) cerr << (#x) << " = " << (x) << '\n'; #define output_vector(v) for(auto &x : v){cout << x << ' ';}cout << '\n'; #define output_pairvector(v) for(auto &x : v){cout << x.first << " " << x.second << '\n';} #define read_vector(v) for(auto &x : v){cin >> x;} #define vt vector #define pb push_back #define eb emplace_back #define pii pair<ll, ll> #define pdd pair<ld, ld> #define fir first #define sec second #define sz(x) ll(x.size()) #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define discretize(x) sort(x.begin(), x.end()); x.erase(unique(x.begin(), x.end()), x.end()); const ll maxn = 1e5 + 5; const ll INF = 1e15; vector<bool> vis(maxn); vector<pii> adj[maxn]; ll n, m, h, k; void dfs(int u) { vis[u] = true; if(u == h) return; for(auto &v : adj[u]) { if(!vis[v.fir]) dfs(v.fir); } } 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) { n = N, m = M, h = H, k = K; k = min(k, 70ll); for(int i=0; i<m; ++i) { adj[x[i]].emplace_back(y[i], c[i]); adj[y[i]].emplace_back(x[i], c[i]); } dfs(0); vector<int> s = {0}; // source nodes for(int i=1; i<n; ++i) { if(arr[i] == 0 && vis[i]) s.push_back(i); } // output_vector(s); vector<vector<ld>> dist(n, vector<ld>(k+5, INF)); priority_queue<pair<ld, int>, vector<pair<ld, int>>, greater<pair<ld, int>>> pq; for(auto &S : s){ for(int i=0; i<=k; ++i) dist[S][i] = 0; } for(int t=0; t<=k; ++t) { for(int i=0; i<n; ++i) { if(dist[i][t] < INF) pq.push({dist[i][t], i}); } while(!pq.empty()) { ld w = pq.top().fir; ll u = pq.top().sec; pq.pop(); // show(u); if(w > dist[u][t] || u == h) continue; for(auto &v : adj[u]) { if(arr[v.fir] == 0 && dist[v.fir][t] > 0) { dist[v.fir][t] = 0; pq.push({0, v.fir}); continue; } if(arr[v.fir] == 2 && (dist[u][t] + v.sec) / 2.0 < dist[v.fir][t+1]) { dist[v.fir][t+1] = (dist[u][t] + v.sec) / 2.0; // pq.push({dist[v.fir][t+1], v.fir}); } if(dist[u][t] + v.sec < dist[v.fir][t]) { dist[v.fir][t] = dist[u][t] + v.sec; pq.push({dist[v.fir][t], v.fir}); } } } } ld ans = INF; for(int i=0; i<=k; ++i) ans = min(ans, dist[h][i]); if(!vis[h]) ans = -1; for(int i=0; i<n; ++i) { vis[i] = false; adj[i].clear(); } return 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...