Submission #729540

#TimeUsernameProblemLanguageResultExecution timeMemory
729540Jean7Dreaming (IOI13_dreaming)C++14
100 / 100
112 ms17088 KiB
#include "dreaming.h"
#include <bits/stdc++.h>

using namespace std ;

const int L = 24 ;
const int N = 1e5+5 ;
const int O = 2e9 ;

bool vs[N] ;
vector <int> v , ans ;
vector <pair<int,int>> g[N] ;

pair <int,int> dfs ( int i , int l ) {
    vs[i] = 1 ;
    pair <int,int> ret = {0,i} ;
    for ( auto it : g[i] ) {
        if ( it.first != l ) {
            pair <int,int> p = dfs ( it.first , i ) ;
            p.first += it.second ;
            if ( p.first > ret.first ) {
                ret = p ;
            }
        }
    }
    return ret ;
}

bool path ( int i , int l , int j ) {
    if ( i == j ) {
        return 1 ;
    }
    for ( auto it : g[i] ) {
        if ( it.first != l ) {
            if ( path ( it.first , i , j ) ) {
                v.push_back(it.second) ;
                return 1 ;
            }
        }
    }
    return 0 ;
}

int travelTime(int n, int m, int l, int A[], int B[], int T[]) {
    for ( int i = 0 ; i < m ; i++ ) {
        g[A[i]+1].push_back({B[i]+1,T[i]}) ;
        g[B[i]+1].push_back({A[i]+1,T[i]}) ;
    }
    int jean = 0 ;
    for ( int i = 1 ; i <= n ; i++ ) {
        if ( vs[i] ) {
            continue ;
        }
        int a = dfs ( i , 0 ).second ;
        int b = dfs ( a , 0 ).second ;
        path ( a , 0 , b ) ;
        int x = 0 ;
        for ( auto it : v ) {
            x += it ;
        }
        jean = max ( jean , x ) ;
        int cur = x , sum = 0 ;
        for ( auto it : v ) {
            sum += it ;
            cur = min ( cur , max ( sum , x - sum ) ) ;
        }
        reverse ( v.begin() , v.end() ) ;
        sum = 0 ;
        for ( auto it : v ) {
            sum += it ;
            cur = min ( cur , max ( sum , x - sum ) ) ;
        }
        ans.push_back(cur) ;
        v.clear() ;
    }
    sort ( ans.begin() , ans.end() , greater <int> () ) ;
    if ( ans.size() > 1 ) {
        jean = max ( jean , ans[0] + ans[1] + l ) ;
    }
    if ( ans.size() > 2 ) {
        jean = max ( jean , ans[1] + ans[2] + l + l ) ;
    }
    return jean ;
}
#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...