Submission #1204396

#TimeUsernameProblemLanguageResultExecution timeMemory
1204396MighilonCyberland (APIO23_cyberland)C++20
100 / 100
143 ms66376 KiB
#include <bits/stdc++.h> using namespace std; #ifdef DEBUG #include "../Library/debug.h" #else #define dbg(x...) #endif typedef long long ll; typedef long double ld; typedef pair<int, int> pi; typedef pair<ll, ll> pl; typedef vector<int> vi; typedef vector<bool> vb; typedef vector<ll> vl; typedef vector<pi> vpi; typedef vector<pl> vpl; #define FOR(i, a, b) for (int i = (a); i < (b); ++i) #define F0R(i, a) for (int i = 0; i < (a); ++i) #define FORd(i, a, b) for (int i = (b) - 1; i >= (a); --i) #define F0Rd(i, a) for (int i = (a) - 1; i >= 0; --i) #define trav(a, x) for (auto& a : x) #define f first #define s second #define pb push_back #define sz(x) (int)(x).size() #define all(x) x.begin(), x.end() const char nl = '\n'; const int INF = 1e9; const int MOD = 1e9 + 7; struct DSU { vector<int> par, sz; int c; // connected components DSU(int n) : par(n), c(n) { sz.resize(n, 1); for (int i = 0; i < n; ++i) par[i] = i; } int find(int i) { return par[i] == i ? i : (par[i] = find(par[i])); } bool same(int i, int j) { return find(i) == find(j); } int get_size(int i) { return sz[find(i)]; } int count() { return c; } int merge(int i, int j) { if ((i = find(i)) == (j = find(j))) return -1; else --c; if (sz[i] > sz[j]) swap(i, j); par[i] = j; sz[j] += sz[i]; return j; } }; double solve(int n,int m,int k,int h,vi x,vi y,vi c,vi arr){ vector<vpi> adj(n); k=min(k,70); DSU dsu(n); F0R(i,m){ if(x[i]!=h&&y[i]!=h) dsu.merge(x[i],y[i]); adj[x[i]].pb({y[i],c[i]}); adj[y[i]].pb({x[i],c[i]}); } using T = tuple<double,int,int>; priority_queue<T,vector<T>,greater<T>>pq; vector<vector<double>> dist(k+1,vector<double>(n, 1e18)); auto f=[&](double d, int _k, int v){ if(d < dist[_k][v]){ dbg(d,_k,v) dist[_k][v]=d; pq.push({d,_k,v}); } }; vector<double> p(k+1,1); FOR(i,1,k+1) p[i]=p[i-1]/2; arr[0]=0; f(0,k,h); while(!pq.empty()){ auto [w,_k,v]=pq.top(); dbg(w,_k,v); pq.pop(); if(dist[_k][v] < w) continue; if(arr[v]==0){ return w; } for(auto [u,_w]:adj[v]){ if(!dsu.same(0,u)) continue; f(w+_w*p[k-_k],_k,u); if(arr[v]==2&&_k>0) f(w+_w*p[k-_k+1],_k-1,u); } } return -1; } #ifdef DEBUG int32_t main(){ ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int TC = 1; cin >> TC; while(TC--){ int n,m,k,h; cin>>n>>m>>k>>h; vi x(m),y(m),c(m),arr(n); // F0R(i,m)cin>>x[i]; // F0R(i,m)cin>>y[i]; // F0R(i,m)cin>>c[i]; F0R(i,n)cin>>arr[i]; F0R(i,m)cin>>x[i]>>y[i]>>c[i]; cout<<fixed<<setprecision(12)<<solve(n,m,k,h,x,y,c,arr)<<nl; } return 0; } #endif
#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...