Submission #12809

#TimeUsernameProblemLanguageResultExecution timeMemory
12809qja0950Dreaming (IOI13_dreaming)C++98
100 / 100
105 ms8696 KiB
#include "dreaming.h"
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

#define MAX_N 101101
typedef long long ll;

vector< pair<int, int> > V[MAX_N];
vector<int> RadSort;
queue<int> Q;

int Check[MAX_N];
int Dis[MAX_N];
int N, M, L;
int Ans;

int Find_Last(int first, int checkp) {
    ll LastDis = -1;
    int LastInd = -1;
    
    Check[first] = checkp;
    Dis[first] = 0;
    
    while(!Q.empty()) Q.pop();
    Q.push(first);
    
    while(!Q.empty()) {
        int now = Q.front(); Q.pop();
        for(int i=0; i<V[now].size(); i++) {
            int next = V[now][i].first;
            int cost = V[now][i].second;
            if(Check[next] == checkp) continue;
            Q.push(next);
            Check[next] = checkp;
            Dis[next] = Dis[now] + 1ll * cost;
        }
        if(Dis[now] > LastDis) {
            LastDis = Dis[now];
            LastInd = now;
        }
    }
    return LastInd;
}
int travelTime(int n, int m, int l, int a[], int b[], int t[]) {
    N = n, M = m, L = l;
    for(int i=0; i<M; i++) {
        V[b[i]].push_back( make_pair(a[i], t[i]) );
        V[a[i]].push_back( make_pair(b[i], t[i]) );
    }
    for(int i=0; i<N; i++) {
        Check[i] = 0;
        Dis[i] = 0;
    }
    
    for(int i=0; i<N; i++) {
        if(Check[i] != 0) continue;
        
        int fir = Find_Last(i  , 1);
        int sec = Find_Last(fir, 2);
        
        int dia = Dis[sec];
        int rad = dia;
        
        Ans = max(Ans, dia);
        
        for(int now = sec; now != fir;) {
            for(int i=0; i<V[now].size(); i++) {
                int next = V[now][i].first;
                int cost = V[now][i].second;
                
                if( (Dis[next] + cost) == Dis[now]) {
                    now = next;
                    break;
                }
            }
            int nowd = Dis[now];
            rad = min(rad, max(nowd, dia-nowd) );
        }
        RadSort.push_back(rad);
    }
    sort( RadSort.begin(), RadSort.end() );
    
    int RadS = (int)RadSort.size();
    if(RadS == 2) {
        int r0 = RadSort[RadS-1], r1 = RadSort[RadS-2];
        int now = r0 + r1 + L;
        Ans = max(Ans, now);
    }
    if(RadS >= 3) {
        int r0 = RadSort[RadS-1], r1 = RadSort[RadS-2], r2 = RadSort[RadS-3];
        int now = max(r0 + r1 + L, r1 + r2 + 2*L);
        Ans = max(Ans, now);
    }
    return Ans;
}

Compilation message (stderr)

dreaming.cpp: In function 'int Find_Last(int, int)':
dreaming.cpp:32:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0; i<V[now].size(); i++) {
                      ~^~~~~~~~~~~~~~
dreaming.cpp: In function 'int travelTime(int, int, int, int*, int*, int*)':
dreaming.cpp:70:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for(int i=0; i<V[now].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...