제출 #1348924

#제출 시각아이디문제언어결과실행 시간메모리
1348924iamsazidh사이버랜드 (APIO23_cyberland)C++20
97 / 100
761 ms2162688 KiB
#include "cyberland.h"
//ᴇᴀᴄʜ ᴘᴇʀꜱᴏɴ ᴡɪʟʟ ᴏɴʟʏ ʜᴀᴠᴇ ᴡʜᴀᴛ ᴛʜᴇʏ ᴇɴᴅᴇᴀᴠᴏᴜʀᴇᴅ ᴛᴏᴡᴀʀᴅꜱ [53:39]
//ꜰᴏʀ ɪɴᴅᴇᴇᴅ, ᴡɪᴛʜ ʜᴀʀᴅꜱʜɪᴘ ᴄᴏᴍᴇꜱ ᴇᴀꜱᴇ. ɪɴᴅᴇᴇᴅ, ᴡɪᴛʜ ʜᴀʀᴅꜱʜɪᴘ ᴄᴏᴍᴇꜱ ᴇᴀꜱᴇ. [94:5–6]
//Author: Sazid Hasan (@iamsazidh)
#include <bits/stdc++.h>
using namespace std;

typedef long long              ll;
typedef double                 dl;
typedef vector<int>            vi;
typedef vector<vector<int>>    vii;
typedef vector<ll>             vl;
typedef vector<bool>           vb;
typedef pair<int,int>         pii;
typedef pair<ll, ll>          pll;

#define ff                first
#define ss                second
#define all(a)            a.begin(),a.end()
#define gcd(a,b)          __gcd(a,b)
#define lcm(a,b)          (a*(b/gcd(a,b)))
#define spc               " "

#ifdef ONLINE_JUDGE
    #define debarr(array)
    #define deb(x)
    #define del
#else
    #define debarr(array)  for(int w = 0; w < array.size(); w++) cerr << #array << "-" << w << " = " << array[w] << endl;
    #define deb(x)         cerr << #x << " = " << x << endl;
    #define del cerr << '\n';
#endif


const double PI =         acos(-1);
const int MOD =           1000000007;
const int inf =           (2147483647);


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) {
    vector<vector<pair<int, int>>> adj(N);
    for(int i = 0; i < M; i++){
        // if(x[i]==H || y[i]==H) continue;
        adj[x[i]].push_back({y[i], c[i]});
        adj[y[i]].push_back({x[i], c[i]});
    }
    vector<vector<vector<dl>>> dp(2, vector<vector<dl>>(K+4, vector<dl>(N, DBL_MAX))); // dp[power1][power2count][node]
    priority_queue<
        pair<pair<pair<int, int>, double>, int>,
        vector<pair<pair<pair<int, int>, double>, int>>, 
        greater<pair<pair<pair<int, int>, double>, int>>
        > pq; // power1, power2, cost, node
    pq.push({{{0, 0}, 0}, 0});
    while(!pq.empty()){
        int p1 = pq.top().ff.ff.ff, p2 = pq.top().ff.ff.ss, node = pq.top().ss;
        dl cost = pq.top().ff.ss;
        pq.pop();
        // if(dp[p1][p2][node]-cost < 1e-6) continue; // handle precision if error occcurs in random testtcase

        for(auto x: adj[node]){
            if(cost + x.ss < dp[p1][p2][x.ff]){
                dp[p1][p2][x.ff] = cost + x.ss;
                if(x.ff!=H) pq.push({{{p1, p2}, dp[p1][p2][x.ff]}, x.ff});
            }
        }
        
        if(arr[node]==0 && dp[1][0][node]!=0){
            dp[1][0][node] = 0;
            pq.push({{{1, 0}, 0}, node});
        }
        if(arr[node]==2 && p2<K){
            for(auto x: adj[node]){
                if(cost/2 + x.ss < dp[p1][p2+1][x.ff]){
                    dp[p1][p2+1][x.ff] = cost/2 + x.ss;
                    if(x.ff!=H) pq.push({{{p1, p2+1}, dp[p1][p2+1][x.ff]}, x.ff});
                }
            }
        }
    }
    dl ans = DBL_MAX;
    for(int i = 0; i < 2; i++){
        for(int j = 0; j <= K; j++) ans = min(ans, dp[i][j][H]);
    }
    if(ans==DBL_MAX) return -1;
    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...