Submission #1038938

#TimeUsernameProblemLanguageResultExecution timeMemory
1038938HappyCapybara꿈 (IOI13_dreaming)C++17
47 / 100
44 ms11032 KiB
#include "dreaming.h"
#include<bits/stdc++.h>
using namespace std;

vector<int> p, s;

int findp(int a){
    if (p[a] == a) return p[a];
    return p[a] = findp(p[a]);
}

void merge(int a, int b){
    a = findp(a);
    b = findp(b);
    if (a == b) return;
    p[b] = a;
    s[a] += s[b];
    s[b] == 0;
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]){
    p.resize(N);
    for (int i=0; i<N; i++) p[i] = i;
    s.resize(N, 1);
    vector<vector<pair<int,int>>> g(N);
    for (int i=0; i<M; i++){
        merge(A[i], B[i]);
        g[A[i]].push_back({B[i], T[i]});
        g[B[i]].push_back({A[i], T[i]});
    }
    vector<int> dm, r;
    vector<bool> done(N, false), seen(N, false);
    vector<int> tp(N, -1), td(N);
    for (int i=0; i<N; i++){
        int j = findp(i);
        if (done[j]) continue;
        done[j] = true;
        if (s[j] == 1){
            dm.push_back(0);
            r.push_back(0);
            continue;
        }
        queue<pair<int,int>> q;
        q.push({j, 0});
        int ft = j, md = 0;
        while (!q.empty()){
            int cur = q.front().first, d = q.front().second;
            q.pop();
            if (seen[cur]) continue;
            seen[cur] = true;
            if (d > md){
                md = d;
                ft = cur;
            }
            for (pair<int,int> next : g[cur]) q.push({next.first, d+next.second});
        }
        tp[ft] = ft;
        td[ft] = 0;
        int ft2 = ft;
        md = 0;
        q.push({ft, 0});
        while (!q.empty()){
            int cur = q.front().first, d = q.front().second;
            q.pop();
            td[cur] = d;
            if (d > md){
                md = d;
                ft2 = cur;
            }
            for (pair<int,int> next : g[cur]){
                if (tp[next.first] == -1){
                    tp[next.first] = cur;
                    q.push({next.first, d+next.second});
                }
            }
        }
        dm.push_back(md);
        int br = md;
        while (ft2 != ft){
            br = min(br, max(td[ft2], md-td[ft2]));
            ft2 = tp[ft2];
        }
        r.push_back(br);
    }

    int res = 0;
    for (int x : dm) res = max(res, x);
    if (r.size() == 2) res = max(res, r[0]+r[1]+L);
    else {
        sort(r.begin(), r.end());
        res = max(res, r[r.size()-1]+r[r.size()-2]+L);
        res = max(res, r[r.size()-2]+r[r.size()-3]+2*L);
    }
    return res;
}

Compilation message (stderr)

dreaming.cpp: In function 'void merge(int, int)':
dreaming.cpp:18:10: warning: value computed is not used [-Wunused-value]
   18 |     s[b] == 0;
#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...