Submission #1853

#TimeUsernameProblemLanguageResultExecution timeMemory
1853tncks0121꿈 (IOI13_dreaming)C++98
100 / 100
136 ms14496 KiB
#include "dreaming.h"

#include <vector>
#include <algorithm>
#include <stdio.h>
#include <queue>
#include <memory.h>
#include <assert.h>

using namespace std;

const int N_ = 200005;
const int C = 10005;
const int inf = 1987654321;

struct Edge {
    int v, c;
    Edge(): v(0), c(0) { }
    Edge(int v, int c): v(v), c(c) { }
};

struct Root {
    int v, c;    
    Root(): v(0), c(0) { }
    Root(int v, int c): v(v), c(c) { }
    bool operator< (const Root &t) const { return c < t.c; }
};

int N, M, L;
vector<Edge> Gph[N_];

int farch[N_][2], farthest[N_];
int Que[N_], Par[N_], Cst[N_], Qf, Qr;
bool visited[N_];
priority_queue<Root> H;
int res;

void findRoot (int r) {
    Qf = Qr = 0; Que[++Qr] = r;
    visited[r] = 1;
    while(Qf < Qr) {
        int u = Que[++Qf]; //printf("%d(%d) ", u, Par[u]);
        for(int i = 0; i < Gph[u].size(); i++) {
            Edge &e = Gph[u][i];
            if(!visited[e.v]) {
                visited[e.v] = 1;
                Par[e.v] = u; Cst[e.v] = e.c; 
                Que[++Qr] = e.v;
            }
        }
    }
    //puts("");
    
    for(int i = Qr; i > 0; i--) {
        int u = Que[i], p = Par[u], c = Cst[u] + farch[u][0];
        //printf("%d: %d %d\n", u, farch[u][0], farch[u][1]);
        if(farch[p][0] < c) {
            farch[p][1] = farch[p][0];
            farch[p][0] = c;
        }else if(farch[p][1] < c){
            farch[p][1] = c;
        }
    }
    
    Qf = Qr = 0; Que[++Qr] = r;
    while(Qf < Qr) {
        int u = Que[++Qf];
        for(int i = 0; i < Gph[u].size(); i++) {
            Edge &e = Gph[u][i];
            if(Par[e.v] != u) continue;
            Que[++Qr] = e.v;
            
            int w = (e.c + farch[e.v][0] >= farch[u][0]);
            farthest[e.v] = e.c + max(farthest[u], farch[u][w]);
        }
    }
    
    int root = r;
    for(int i = 1; i <= Qr; i++) {
        int u = Que[i];
        farthest[u] = max(farthest[u], farch[u][0]);
        res = max(res, farthest[u]);
        res = max(res, farch[u][0] + farch[u][1]);
        if(farthest[u] < farthest[root]) root = u;
    }
    
    H.push(Root(root, farthest[root]));
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    int i, j;
    
    ::N = N; ::M = M; ::L = L;
    for(i = 0; i < M; i++) {
        int u = A[i]+1, v = B[i]+1;
        Gph[u].push_back(Edge(v, T[i]));
        Gph[v].push_back(Edge(u, T[i]));
    }
    
    for(i = 1; i <= N; i++) {
        if(!visited[i]) findRoot(i);
    }
    
    while(H.size() > 1) {
        Root r2 = H.top(); H.pop();
        Root r1 = H.top(); H.pop();
        res = max(res, r1.c + L + r2.c);
        Gph[r1.v].push_back( Edge(r2.v, L) );
        Gph[r2.v].push_back( Edge(r1.v, L) );
        H.push( Root(r2.v, max(r1.c + L, r2.c)) );
    }
    
    memset(visited, 0, sizeof visited);
    memset(farch, 0, sizeof farch);
    memset(farthest, 0, sizeof farthest);
    memset(Cst, 0, sizeof Cst);
    
    findRoot(1);
    return res;
}

Compilation message (stderr)

dreaming.cpp: In function 'void findRoot(int)':
dreaming.cpp:43:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i = 0; i < Gph[u].size(); i++) {
                        ~~^~~~~~~~~~~~~~~
dreaming.cpp:68:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i = 0; i < Gph[u].size(); i++) {
                        ~~^~~~~~~~~~~~~~~
dreaming.cpp: In function 'int travelTime(int, int, int, int*, int*, int*)':
dreaming.cpp:91:12: warning: unused variable 'j' [-Wunused-variable]
     int i, j;
            ^
#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...