Submission #777409

#TimeUsernameProblemLanguageResultExecution timeMemory
777409groshiCyberland (APIO23_cyberland)C++17
97 / 100
3078 ms121780 KiB
#include<bits/stdc++.h>
#pragma GCC optimize "unroll-loops"
#pragma GCC optimize "O3"
#include "cyberland.h"
using namespace std;
vector<int> moge;
vector<int> Q[100010];
bool odw[100010];
vector<int> co;
void dfs(int x,int nie)
{
    odw[x]=1;
    if(x==nie)
        return;
    if(co[x]==0)
        moge.push_back(x);
    for(int i=0;i<Q[x].size();i+=2)
        if(odw[Q[x][i]]==0)
            dfs(Q[x][i],nie);
}
double solve(int n,int m,int k,int h,vector<int> x,vector<int> y,vector<int> c, vector<int> arr)
{
    for(int i=0;i<n;i++)
        Q[i].clear(),odw[i]=0;
    vector<double> dp[n+3];
    for(int i=0;i<m;i++)
    {
        Q[x[i]].push_back(y[i]);
        Q[y[i]].push_back(x[i]);
        Q[x[i]].push_back(c[i]);
        Q[y[i]].push_back(c[i]);
    }
    swap(arr,co);
    moge.clear();
    dfs(0,h);
    moge.push_back(0);
    priority_queue<pair<double,pair<int,int> > > kolejka;
    k=min(k,70);
    for(int i=0;i<n;i++)
        for(int j=0;j<=k;j++)
            dp[i].push_back(1e14);
    for(int i=0;i<moge.size();i++)
    {
        kolejka.push({0.0,{moge[i],0}});
        for(int j=0;j<=k;j++)
            dp[moge[i]][j]=0;
    }
    while(!kolejka.empty())
    {
        auto para=kolejka.top();
        kolejka.pop();
        int x=para.second.first;
        int typ=para.second.second;
        double ile=-para.first;
        if(ile>dp[x][typ])
            continue;
        if(x==h)
            continue;
        for(int i=0;i<Q[x].size();i+=2)
        {
            int pom=Q[x][i];
            double dodaj=Q[x][i+1];
            if(dp[pom][typ]>ile+dodaj)
                kolejka.push({-ile-dodaj,{pom,typ}}),dp[pom][typ]=ile+dodaj;
            if(co[pom]!=2)
                continue;
            dodaj+=ile;
            dodaj/=2;
            if(dp[pom][typ+1]>dodaj && typ+1<=k)
                kolejka.push({-dodaj,{pom,typ+1}}),dp[pom][typ+1]=dodaj;
        }
    }
    double minn=1e14;
    for(int i=0;i<=k;i++)
        minn=min(minn,dp[h][i]);
    if(minn==1e14)
        return -1;
    else return minn;
}

Compilation message (stderr)

cyberland.cpp: In function 'void dfs(int, int)':
cyberland.cpp:17:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 |     for(int i=0;i<Q[x].size();i+=2)
      |                 ~^~~~~~~~~~~~
cyberland.cpp: In function 'double solve(int, int, int, int, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
cyberland.cpp:42:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   42 |     for(int i=0;i<moge.size();i++)
      |                 ~^~~~~~~~~~~~
cyberland.cpp:59:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |         for(int i=0;i<Q[x].size();i+=2)
      |                     ~^~~~~~~~~~~~
#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...