제출 #814520

#제출 시각아이디문제언어결과실행 시간메모리
814520Hanksburger사이버랜드 (APIO23_cyberland)C++17
44 / 100
2371 ms346472 KiB
#include "cyberland.h"
#include <bits/stdc++.h>
using namespace std;
vector<pair<long long, long double> > adj[3000005];
priority_queue<pair<long double, long long> > pq;
long long final[3000005], ok[100005], h;
long double dist[3000005];
void dfs(long long u)
{
    ok[u]=1;
    for (long long i=0; i<adj[u].size(); i++)
    {
        long long v=adj[u][i].first;
        if (ok[v] || v==h)
            continue;
        dfs(v);
    }
}
double solve(int n, int m, int k, int hh, vector<int> x, vector<int> y, vector<int> c, vector<int> a)
{
    h=hh;
    k=min(k, 30);
    for (long long i=0; i<n; i++)
        adj[i].clear();
    for (long long i=0; i<m; i++)
    {
        for (long long j=0; j<=k; j++)
        {
            adj[j*n+x[i]].push_back({j*n+y[i], (long double)c[i]/(1LL<<(k-j))});
            adj[j*n+y[i]].push_back({j*n+x[i], (long double)c[i]/(1LL<<(k-j))});
            if (j<k)
            {
                if (a[x[i]]==2)
                    adj[j*n+y[i]].push_back({(j+1)*n+x[i], (long double)c[i]/(1LL<<(k-j))});
                if (a[y[i]]==2)
                    adj[j*n+x[i]].push_back({(j+1)*n+y[i], (long double)c[i]/(1LL<<(k-j))});
            }
        }
    }
    for (long long i=0; i<n; i++)
        ok[i]=0;
    dfs(0);
    for (long long i=0; i<(k+1)*n; i++)
    {
        dist[i]=1e18;
        final[i]=0;
    }
    dist[0]=0;
    pq.push({0, 0});
    for (long long i=1; i<n; i++)
    {
        if (!a[i] && ok[i])
        {
            dist[i]=0;
            pq.push({0, i});
        }
    }
    while (!pq.empty())
    {
        long long u=pq.top().second;
        pq.pop();
        if (final[u])
            continue;
        final[u]=1;
        for (long long i=0; i<adj[u].size(); i++)
        {
            long long v=adj[u][i].first;
            long double w=adj[u][i].second;
            if (dist[u]+w<dist[v])
            {
                dist[v]=dist[u]+w;
                pq.push({-dist[v], v});
            }
        }
    }
    long double ans=1e18;
    for (long long i=0; i<=k; i++)
        ans=min(ans, dist[i*n+h]*(1<<(k-i)));
    if (ans<5e17)
        return ans;
    else
        return -1;
}

컴파일 시 표준 에러 (stderr) 메시지

cyberland.cpp: In function 'void dfs(long long int)':
cyberland.cpp:11:26: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long double> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   11 |     for (long long i=0; i<adj[u].size(); i++)
      |                         ~^~~~~~~~~~~~~~
cyberland.cpp: In function 'double solve(int, int, int, int, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
cyberland.cpp:65:30: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long double> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   65 |         for (long long i=0; i<adj[u].size(); i++)
      |                             ~^~~~~~~~~~~~~~
#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...