Submission #425459

#TimeUsernameProblemLanguageResultExecution timeMemory
425459ngraceShortcut (IOI16_shortcut)C++14
23 / 100
2064 ms3940 KiB
#include "shortcut.h"
#include <vector>
#include <queue>
#include <utility>
#include <iostream>
#include <limits.h>
#include <algorithm>
using namespace std;
#define v vector
#define pii pair<int,int>
#define fi first
#define se second
#define pq priority_queue

v<v<long long>> adj;
int N;

long long floyd(){
    for(int k=0;k<2*N;k++){
        for(int i=0;i<2*N;i++){
            for(int j=0;j<2*N;j++){
                if(adj[i][k]==LLONG_MAX || adj[k][j]==LLONG_MAX) continue;
                if(adj[i][j] > adj[i][k] + adj[k][j]){
                    adj[i][j] = adj[i][k] + adj[k][j];
                    adj[j][i] = adj[i][k] + adj[k][j];
                }
            }
        }
    }
    long long out=0;
    for(int i=0;i<2*N;i++){
        for(int j=0;j<2*N;j++){
            if(adj[i][j]>out && adj[i][j]!=LLONG_MAX) out=adj[i][j];
        }
    }
    return out;
}

long long find_shortcut(int n, std::vector<int> l, std::vector<int> d, int c)
{
    if(n<=500){
        N=n;
        adj=v<v<long long>> (2*n,v<long long>(2*N, LLONG_MAX));
        for(int i=0;i<n-1;i++){
            adj[i][i+1] = l[i];
            adj[i+1][i] = l[i];
            adj[i][i]=0;
        }
        for(int i=0;i<n;i++){
            adj[i][i+n] = d[i];
            adj[i+n][i] = d[i];
            adj[i+n][i+n]=0;
        }

        long long origDiam = floyd();
        long long out=origDiam;

        v<v<long long>> large;
        for(int i=n;i<2*n;i++){
            for(int j=i+1;j<2*n;j++){
                large.push_back({-adj[i][j], i, j});
            }
        }
        sort(large.begin(),large.end());

        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                long long diam=0;
                for(v<long long> it: large){
                    long long a=it[1];
                    long long b=it[2];

                    long long dist=adj[a][b];
                    long long dist2=adj[a][i]+adj[b][j]+c;
                    long long dist3=adj[a][j]+adj[b][i]+c;
                    if(dist2<dist) dist=dist2;
                    if(dist3<dist) dist=dist3;
                    if(dist>diam) diam=dist;
                    if(diam>out) break;
                }
                if(diam<out) out=diam;
            }
        }

        return out;
    }
}

Compilation message (stderr)

shortcut.cpp: In function 'long long int find_shortcut(int, std::vector<int>, std::vector<int>, int)':
shortcut.cpp:87:1: warning: control reaches end of non-void function [-Wreturn-type]
   87 | }
      | ^
#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...