제출 #983873

#제출 시각아이디문제언어결과실행 시간메모리
983873Shayan86사이버랜드 (APIO23_cyberland)C++17
15 / 100
1524 ms111416 KiB
#include "cyberland.h" #include <bits/stdc++.h> using namespace std; #pragma GCC optimize("O3,unroll-loops") // #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") // Ofast, O0, O1, O2, O3, unroll-loops, fast-math, trapv typedef long long ll; typedef long double ld; typedef pair<ll, ll> pll; typedef pair<int, int> pii; #define Mp make_pair #define sep ' ' #define endl '\n' #define F first #define S second #define pb push_back #define SZ(x) (int)x.size() #define all(x) (x).begin(),(x).end() #define kill(res) cout << res << '\n', exit(0); #define set_dec(x) cout << fixed << setprecision(x); #define fast_io ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define file_io freopen("input.txt", "r", stdin) ; freopen("output.txt", "w", stdout); mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const ll K = 72; const ll N = 1e5 + 50; const ll inf = 1e18; ll n, m, k, H, a[N]; ld dist[N][K]; bool mark[N]; vector<pll> adj[N]; void dfs(int v){ mark[v] = true; for(auto [u, w]: adj[v]) if(!mark[u]) dfs(u); } void dijk(){ for(int i = 0; i < n; i++) for(int j = 0; j <= k; j++) dist[i][j] = inf; priority_queue<pair<ld, pii>, vector<pair<ld, pii>>, greater<pair<ld, pii>>> pq; for(int i = 0; i < n; i++) if(!a[i] && mark[i]){ dist[i][0] = 0; pq.push({dist[i][0], {i, 0}}); } while (!pq.empty()){ auto [v, id] = pq.top().S; auto vd = pq.top().F; pq.pop(); if(vd != dist[v][id]) continue; if(id < k){ if(dist[v][id+1] > dist[v][id]){ dist[v][id+1] = dist[v][id]; pq.push({dist[v][id+1], {v, id+1}}); } } for (auto [u, w]: adj[v]){ if(dist[u][id] > dist[v][id] + w){ dist[u][id] = dist[v][id] + w; pq.push({dist[u][id], {u, id}}); } if(a[u] != 2 || id == k) continue; if(dist[u][id+1] * 2 > dist[v][id] + w){ dist[u][id+1] = dist[v][id] + w; dist[u][id+1] /= 2; pq.push({dist[u][id+1], {u, id+1}}); } } } } void dijk2(){ for(int i = 0; i < n; i++) for(int j = 0; j <= k; j++) dist[i][j] = inf; priority_queue<pair<ld, pii>, vector<pair<ld, pii>>, greater<pair<ld, pii>>> pq; for(int i = 0; i < n; i++) if(i != H){ dist[i][0] = 0; pq.push({dist[i][0], {i, 0}}); } while (!pq.empty()){ auto [v, id] = pq.top().S; auto vd = pq.top().F; pq.pop(); if(vd != dist[v][id]) continue; if(id < k){ if(dist[v][id+1] > dist[v][id]){ dist[v][id+1] = dist[v][id]; pq.push({dist[v][id+1], {v, id+1}}); } } for (auto [u, w]: adj[v]){ if(dist[u][id] > dist[v][id] + w){ dist[u][id] = dist[v][id] + w; pq.push({dist[u][id], {u, id}}); } if(a[u] != 2 || id == k) continue; if(dist[u][id+1] * 2 > dist[v][id] + w){ dist[u][id+1] = dist[v][id] + w; dist[u][id+1] /= 2; pq.push({dist[u][id+1], {u, id+1}}); } } } } 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; k = K; H = H_; for(int i = 0; i < n; i++){ adj[i].clear(); mark[i] = false; } for(int i = 0; i < m; i++){ int u = x[i]; int v = y[i]; int w = c[i]; adj[u].pb({v, w}); adj[v].pb({u, w}); } for(int i = 0; i < n; i++) a[i] = arr[i]; dfs(0); if(!mark[H]) return -1; k = min(k, 70ll); a[0] = 0; dijk(); ld res = inf; for(int i = 0; i <= k; i++) res = min(res, dist[H][i]); /* if(K > k){ k++; dijk2(); res = min(res, dist[H][k]); } */ return res; }
#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...