Submission #1152210

#TimeUsernameProblemLanguageResultExecution timeMemory
1152210elipsenCyberland (APIO23_cyberland)C++20
44 / 100
35 ms11096 KiB
#include "cyberland.h" #include <vector> #include <unordered_map> #include <queue> #include <utility> #define v vector #define u_m unordered_map #define q queue #define p_q priority_queue #define p pair #define ll long long using namespace std; class WorldMap { const ll tempInf = 1000000000000000; int countryCount; int cyberland; u_m<int, v<p<int, int>>> friends; v<ll> dspaSourceResult; u_m<int, ll> halvers; v<int> powers; public: // Initialize the world map WorldMap(int countries, int destinationIndex) { countryCount = countries; cyberland = destinationIndex; friends.clear(); dspaSourceResult.clear(); halvers.clear(); powers.clear(); } void connect(int friend1, int friend2, int distance) { friends[friend1].push_back(make_pair(friend2, distance)); friends[friend2].push_back(make_pair(friend1, distance)); } void notePowers(v<int> arr) { powers = arr; } void dspaSource() { // Initialize stuff dspaSourceResult.clear(); dspaSourceResult.resize(countryCount, tempInf); p_q<p<ll, int>, v<p<ll, int>>, greater<p<ll, int>>> dspaQueue; dspaQueue.push(make_pair(0, 0)); dspaSourceResult[0] = 0; int selected; int friendID; int friendDist; // Go through the queue while (!(dspaQueue.empty())) { selected = dspaQueue.top().second; dspaQueue.pop(); // Go through the first-in-line's friends for (p<int, int> fren : friends[selected]) { friendID = fren.first; friendDist = fren.second; // If the friend has 0-powers if (powers[friendID] == 0) { // Propagate only if it hasn't been hit before if (dspaSourceResult[friendID] > 0) { dspaSourceResult[friendID] = 0; if (friendID != cyberland) dspaQueue.push(make_pair(0, friendID)); } } else { // Propagate only if the value changes if (dspaSourceResult[selected] + friendDist < dspaSourceResult[friendID]) { dspaSourceResult[friendID] = dspaSourceResult[selected] + friendDist; // Note that we cannot leave Cyberland if (friendID != cyberland) dspaQueue.push(make_pair(dspaSourceResult[friendID], friendID)); } } } } } void dspaDestination() { // Initialize stuff v<ll> dspaDestinationResult(countryCount, tempInf); p_q<p<ll, int>, v<p<ll, int>>, greater<p<ll, int>>> dspaQueue; q<int> halverQueue; dspaQueue.push(make_pair(0, cyberland)); dspaDestinationResult[cyberland] = 0; int selected; int friendID; int friendDist; // Go through the queue while (!(dspaQueue.empty())) { selected = dspaQueue.top().second; dspaQueue.pop(); // Go through the first-in-line's friends for (p<int, int> fren : friends[selected]) { friendID = fren.first; friendDist = fren.second; // If the friend does not have 0-powers if (powers[friendID] != 0) { // Propagate only if the value changes if (dspaDestinationResult[selected] + friendDist < dspaDestinationResult[friendID]) { dspaDestinationResult[friendID] = dspaDestinationResult[selected] + friendDist; // Propagate only if the friend's power is 1, log if its power is 2 if (powers[friendID] == 1) dspaQueue.push(make_pair(dspaDestinationResult[friendID], friendID)); else halverQueue.push(friendID); } } } } // Deal with the queue for 2-powers while (!(halverQueue.empty())) { selected = halverQueue.front(); halverQueue.pop(); halvers[selected] = dspaDestinationResult[selected]; } } double div2(ll num, int expo) { double k = 2; double ans = num; while (expo != 0) { if (expo & 1) ans = ans / k; expo = expo >> 1; k = k * k; } return ans; } double determinePath(int twoPower) { // Perform DijkstraSPA once from source, apply 0 and 1 rules dspaSource(); // Perform DijkstraSPA once again, stop at 0s and 2s, record 2s dspaDestination(); // Then consolidate hereon if (dspaSourceResult[cyberland] == tempInf) return -1; double minimum = dspaSourceResult[cyberland]; for (auto info : halvers) { int halver = info.first; ll distLeft = info.second; double contender = distLeft + div2(dspaSourceResult[halver], twoPower); minimum = min(minimum, contender); } return minimum; } }; double solve(int N, int M, int K, int H, v<int> x, v<int> y, v<int> c, v<int> arr) { // Rename every int to something more descriptive int countryCount = N; int roadCount = M; int bitShifter = K; int cyberLocation = H; WorldMap theRoadToCyberland(countryCount, cyberLocation); for (int road = 0; road < roadCount; road++) theRoadToCyberland.connect(x[road], y[road], c[road]); theRoadToCyberland.notePowers(arr); return theRoadToCyberland.determinePath(bitShifter); }
#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...