Submission #1103873

#TimeUsernameProblemLanguageResultExecution timeMemory
1103873dubabubaDreaming (IOI13_dreaming)C++14
100 / 100
46 ms17008 KiB
#include "dreaming.h"
#include <bits/stdc++.h>

using namespace std;

#define ff first
#define ss second
#define MP make_pair

typedef pair<int, int> pii;

const int inf = 1e9 + 10;
const int mxn = 1e5 + 10;
vector<pii> adj[mxn];
int m1[mxn], m2[mxn];

void update(int &M1, int &M2, int sus) {
    if(sus > M1) {
        M2 = M1;
        M1 = sus;
    }
    else if(sus > M2) {
        M2 = sus;
    }
}

void maxer(int &MAX, int CMP) { if(MAX < CMP) MAX = CMP; }

int max_dfs(int u, int par = -1) {
    if(adj[u].size() == 1 || adj[u].size() == 0)
        m1[u] = 0;
    for(pii e : adj[u]) {
        int v = e.ff;
        int c = e.ss;
        if(v == par) continue;
        if(m1[v] > -1) continue;

        int t = max_dfs(v, u) + c;
        update(m1[u], m2[u], t);
        // update(m1[u], m2[u], m2[v] + c);
    }

    // cout << u << ": " << m1[u] << ' ' << m2[u] << endl;
    return m1[u];
}

int fix_dfs(int u, int prv = -1) {
    int opt = -1;
    int sus = m1[u];
    int len = -1;

    // cout << "fix: " << u << endl;
    for(pii e : adj[u]) {
        int v = e.ff;
        int c = e.ss;
        if(v == prv) continue;
        if(m1[v] + c < m1[u]) continue;
        
        int NEW = max(m1[v], m2[u] + c);
        // cout << v << ' ' << NEW << endl;
        if(NEW < sus) {
            sus = NEW;
            opt = v;
            len = c;
        }
    }

    // cout << "opt = " << ' ' << opt << endl;

    if(opt == -1) return u;

    m1[u] = 0;
    m2[u] = -inf;
    for(pii e : adj[u]) {
        int v = e.ff;
        int c = e.ss;
        // if(v == prv) continue;
        if(v == opt) continue;

        update(m1[u], m2[u], m1[v] + c);
    }

    // cout << m1[u] << ' ' << m2[u] << endl;

    update(m1[opt], m2[opt], m1[u] + len);
    // update(m1[opt], m2[opt], M2);
    return fix_dfs(opt, u);
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    for(int i = 0; i < M; i++) {
        int u = A[i];
        int v = B[i];
        int c = T[i];
        // cout << u << ' ' << v << ": " << c << endl;
        adj[u].push_back(MP(v, c));
        adj[v].push_back(MP(u, c));
    }

    for(int i = 0; i < N; i++) {
        m1[i] = m2[i] = -1;
    }

    vector<int> upt;
    for(int i = 0; i < N; i++) {
        if(m1[i] > -1) continue;
        // cout << "root = " << i << endl;
        max_dfs(i);
        // cout << "------\n";
        upt.push_back(i);
    }

    int ans = 0;
    vector<int> roots;
    for(int x : upt) {
        int y = fix_dfs(x);
        roots.push_back(y);
        // cout << x << ": " << y << endl;
        maxer(ans, m1[y] + m2[y]);
    }

    if(roots.size() == 1)
        return ans;

    pii M1 = MP(-inf, -1);
    pii M2 = MP(-inf, -1);
    pii M3 = MP(-inf, -1);

    for(int u : roots) {
        pii cur = MP(m1[u], u);
        if(cur > M1) {
            M3 = M2;
            M2 = M1;
            M1 = cur;
        }
        else if(cur > M2) {
            M3 = M2;
            M2 = cur;
        }
        else if(cur > M3) {
            M3 = cur;
        }
    }

    maxer(ans, M1.ff + M2.ff + L);
    maxer(ans, M2.ff + M3.ff + 2 * L);
    return ans;
}
#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...