Submission #751173

#TimeUsernameProblemLanguageResultExecution timeMemory
751173Hona_NguyenCyberland (APIO23_cyberland)C++17
97 / 100
1244 ms137352 KiB
#include "cyberland.h" #include <bits/stdc++.h> #pragma GCC optimize "Ofast" using namespace std; double sub_2_5(int N, int M, int K, int H, std::vector<int> x, std::vector<int> y, std::vector<int> c, std::vector<int> arr){ struct ii{ int id; double w; }; struct cmp{ bool operator () (ii A, ii B){ return A.w > B.w; } }; priority_queue<ii, vector<ii>, cmp> pq; vector<double> dp(N, (double)(1e15)); vector<vector<pair<int,int>>> G(N); for(int i=0;i<M;i++){ G[x[i]].push_back({y[i], c[i]}); G[y[i]].push_back({x[i], c[i]}); } dp[0] = 0; pq.push({0,dp[0]}); while(pq.size()){ ii u = pq.top(); pq.pop(); if(dp[u.id] < u.w) continue; for(pair<int,int> v: G[u.id]){ if(dp[u.id] + v.second < dp[v.first]){ dp[v.first] = dp[u.id] + v.second; pq.push({v.first, dp[v.first]}); } } } if(dp[H] == (double)(1e15)) dp[H] = -1; return dp[H]; } double sub_3_6(int N, int M, int K, int H, std::vector<int> x, std::vector<int> y, std::vector<int> c, std::vector<int> arr){ struct ii{ int id; double w; }; struct cmp{ bool operator () (ii A, ii B){ return A.w > B.w; } }; priority_queue<ii, vector<ii>, cmp> pq; vector<double> dp(N, (double)(1e15)); vector<vector<pair<int,int>>> G(N); for(int i=0;i<M;i++){ G[x[i]].push_back({y[i], c[i]}); G[y[i]].push_back({x[i], c[i]}); } dp[0] = 0; pq.push({0,dp[0]}); vector<bool> vis(N,false); queue<int> Q; Q.push(0); vis[0] = true; while(Q.size()){ int u = Q.front(); Q.pop(); for(pair<int,int> v: G[u]){ if(vis[v.first] == true || v.first == H) continue; vis[v.first] = true; Q.push(v.first); } } for(int i=1;i<N;i++){ if(arr[i] == 0 && vis[i] == true){ dp[i] = 0; pq.push({i,dp[i]}); } } while(pq.size()){ ii u = pq.top(); pq.pop(); if(dp[u.id] < u.w) continue; for(pair<int,int> v: G[u.id]){ if(dp[u.id] + v.second < dp[v.first]){ dp[v.first] = dp[u.id] + v.second; pq.push({v.first, dp[v.first]}); } } } if(dp[H] == (double)(1e15)) dp[H] = -1; return dp[H]; } double sub_1_4_7(int N, int M, int K, int H, std::vector<int> x, std::vector<int> y, std::vector<int> c, std::vector<int> arr){ struct ii{ int id; int div2; double w; }; struct cmp{ bool operator () (ii A, ii B){ return A.w > B.w; } }; priority_queue<ii, vector<ii>, cmp> pq; vector<vector<double>> dp(N, vector<double> (K+2, (double)(1e15))); vector<vector<pair<int,int>>> G(N); for(int i=0;i<M;i++){ G[x[i]].push_back({y[i], c[i]}); G[y[i]].push_back({x[i], c[i]}); } dp[0][0] = 0; pq.push({0,0,dp[0][0]}); vector<bool> vis(N,false); queue<int> Q; Q.push(0); vis[0] = true; while(Q.size()){ int u = Q.front(); Q.pop(); for(pair<int,int> v: G[u]){ if(vis[v.first] == true || v.first == H) continue; vis[v.first] = true; Q.push(v.first); } } for(int i=1;i<N;i++){ if(arr[i] == 0 && vis[i] == true){ dp[i][0] = 0; pq.push({i,0,dp[i][0]}); } } while(pq.size()){ ii u = pq.top(); pq.pop(); if(dp[u.id][u.div2] < u.w) continue; if(u.id == H) continue; for(pair<int,int> v: G[u.id]){ if(dp[u.id][u.div2] + v.second < dp[v.first][u.div2]){ dp[v.first][u.div2] = dp[u.id][u.div2] + v.second; pq.push({v.first, u.div2, dp[v.first][u.div2]}); } double tmp = (dp[u.id][u.div2] + v.second) / 2.0; if(u.div2 + 1 <= K && arr[v.first] == 2){ if(tmp < dp[v.first][u.div2+1]){ dp[v.first][u.div2+1] = tmp; pq.push({v.first, u.div2+1, dp[v.first][u.div2+1]}); } } } } double ans = (double)(1e15); for(int i=0;i<=K;i++) ans = min(ans, dp[H][i]); if(ans == (double)(1e15)) ans = -1; return ans; } double sub_8(int N, int M, int K, int H, std::vector<int> x, std::vector<int> y, std::vector<int> c, std::vector<int> arr){ struct ii{ int id; int div2; double w; }; struct cmp{ bool operator () (ii A, ii B){ return A.w > B.w; } }; priority_queue<ii, vector<ii>, cmp> pq; vector<vector<double>> dp(N, vector<double> (K+2, (double)(1e15))); vector<vector<int>> vis_go(N, vector<int> (K+2, 0)); vector<vector<pair<int,int>>> G(N); for(int i=0;i<M;i++){ G[x[i]].push_back({y[i], c[i]}); G[y[i]].push_back({x[i], c[i]}); } dp[0][0] = 0; pq.push({0,0,dp[0][0]}); vis_go[0][0] = 1; vector<bool> vis(N,false); queue<int> Q; Q.push(0); vis[0] = true; while(Q.size()){ int u = Q.front(); Q.pop(); for(pair<int,int> v: G[u]){ if(vis[v.first] == true || v.first == H) continue; vis[v.first] = true; Q.push(v.first); } } for(int i=1;i<N;i++){ if(arr[i] == 0 && vis[i] == true){ dp[i][0] = 0; vis_go[i][0] = 1; pq.push({i,0,dp[i][0]}); } } while(pq.size()){ ii u = pq.top(); pq.pop(); if(dp[u.id][u.div2] < u.w) continue; if(u.id == H) continue; for(pair<int,int> v: G[u.id]){ if(dp[u.id][u.div2] + v.second < dp[v.first][u.div2] && vis_go[v.first][u.div2+1] < 35){ dp[v.first][u.div2] = dp[u.id][u.div2] + v.second; vis_go[v.first][u.div2]++; pq.push({v.first, u.div2, dp[v.first][u.div2]}); } double tmp = (dp[u.id][u.div2] + v.second) / 2.0; if(u.div2 + 1 <= K && arr[v.first] == 2){ if(tmp < dp[v.first][u.div2+1] && vis_go[v.first][u.div2+1] < 35){ dp[v.first][u.div2+1] = tmp; vis_go[v.first][u.div2+1]++; pq.push({v.first, u.div2+1, dp[v.first][u.div2+1]}); } } } } double ans = (double)(1e15); for(int i=0;i<=K;i++) ans = min(ans, dp[H][i]); if(ans == (double)(1e15)) ans = -1; return ans; } 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){ int check_sub_2_5 = 0; for(int i=0;i<N;i++) check_sub_2_5 += (arr[i] == 1); if(check_sub_2_5 == N) return sub_2_5(N,M,K,H,x,y,c,arr); int check_sub_3_6 = 0; for(int i=0;i<N;i++) check_sub_3_6 += (arr[i] != 2); if(check_sub_3_6 == N) return sub_3_6(N,M,K,H,x,y,c,arr); if(K <= 30) return sub_1_4_7(N,M,K,H,x,y,c,arr); return sub_8(N,M,min(K,100),H,x,y,c,arr); }
#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...