Submission #1366865

#TimeUsernameProblemLanguageResultExecution timeMemory
1366865jumpCyberland (APIO23_cyberland)C++20
0 / 100
1039 ms34608 KiB
#include "cyberland.h"
#include <bits/stdc++.h>
bool visit[100010];
int type[100010];
long double dist[69][100010];
int NG,MG,KG,HG;
std::vector<std::pair<int,int>> adj[100010];
void dfs(int curr,int par){
    //std::cout << '|' << curr;
    if(visit[curr])return;
    visit[curr]=true;
    if(curr==HG)return;
    for(auto [to,w]:adj[curr]){
        if(to==par)continue;
        //std::cout << ' ' << to;
        dfs(to,curr);
    }
}
long double pow2[100];
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) {
    K=std::min(K,68);
    NG=N,MG=M,KG=K,HG=H;
    pow2[0]=1;
    for(int i=1;i<=K;i++)pow2[i]=pow2[i-1]*2;;
    for(int i=0;i<N;i++){
        type[i]=arr[i];
        for(int j=0;j<=K;j++)dist[j][i]=1e15;
    }
    dist[0][H]=0;
    for(int i=0;i<M;i++){
        //std::cout << x[i] << ' ' << y[i] << ' ' << c[i] << '\n';
        adj[x[i]].push_back({y[i],c[i]});
        adj[y[i]].push_back({x[i],c[i]});
    }
    dfs(0,0);
    std::priority_queue<std::pair<long double,std::pair<int,int>>> pq;
    pq.push({-0,{0,H}});
    long double res = 1e18;
    while(!pq.empty()){
        long double currWeight = -pq.top().first;
        int currDev = pq.top().second.first;
        int currNode = pq.top().second.second;
        //std::cout << currNode << ' ' << adj[currNode].size() << '\n';
        pq.pop();
        if(visit[currNode]&&(currNode==0||arr[currNode]==0))res=std::min(res,currWeight);
        if(!visit[currNode])continue;
        for(auto [to,w]:adj[currNode]){
            if(type[currNode]==2&&currDev<K&&dist[currDev+1][to]>currWeight+(((long double)w)/(pow2[currDev+1]))){
                dist[currDev+1][to]=currWeight+(((long double)w)/(pow2[currDev+1]));
                pq.push({-dist[currDev+1][to],{currDev+1,to}});
            }
            //std::cout << to << ' ' << dist[currDev][to] << ' ' << currWeight+(((long double)w)/(1<<currDev)) << '\n';
            if(dist[currDev][to]>currWeight+(((long double)w)/((pow2[currDev])))){
                dist[currDev][to]=currWeight+(((long double)w)/((pow2[currDev])));
                pq.push({-dist[currDev][to],{currDev,to}});
            }
        }
    }
    if(res>=1e15)res=-1;
    return res;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...