답안 #555230

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
555230 2022-04-30T09:50:35 Z alextodoran Islands (IOI08_islands) C++17
80 / 100
707 ms 131072 KB
/**
 ____ ____ ____ ____ ____
||a |||t |||o |||d |||o ||
||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|

**/

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N_MAX = 1000000;

int N;
struct Edge {
    int to;
    int len;
};
vector <Edge> adj[N_MAX + 2];

bool seen[N_MAX + 2];
Edge par[N_MAX + 2];
int depth[N_MAX + 2];

tuple <int, int, int> backEdge;

void dfs (int u) {
    seen[u] = true;
    for (Edge e : adj[u]) {
        if (seen[e.to] == false) {
            par[e.to] = Edge{u, e.len};
            depth[e.to] = depth[u] + 1;
            dfs(e.to);
        } else if (depth[e.to] > depth[u]) {
            backEdge = make_tuple(u, e.to, e.len);
        }
    }
}

bool root[N_MAX + 2];

ll maxAny[N_MAX + 2];
ll maxDown[N_MAX + 2];

void compute (int u) {
    seen[u] = true;
    vector <ll> maxDowns;
    for (Edge e : adj[u]) {
        if (seen[e.to] == false && root[e.to] == false) {
            compute(e.to);
            maxAny[u] = max(maxAny[u], maxAny[e.to]);
            maxDown[u] = max(maxDown[u], maxDown[e.to] + e.len);
            maxDowns.push_back(maxDown[e.to] + e.len);
        }
    }
    sort(maxDowns.begin(), maxDowns.end(), greater <ll> ());
    if ((int) maxDowns.size() >= 2) {
        maxAny[u] = max(maxAny[u], maxDowns[0] + maxDowns[1]);
    }
    maxAny[u] = max(maxAny[u], maxDown[u]);
}

vector <vector <int>> rootGroups;

int main () {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> N;
    for (int u = 1; u <= N; u++) {
        Edge e;
        cin >> e.to >> e.len;
        adj[u].push_back(Edge{e.to, e.len});
        adj[e.to].push_back(Edge{u, e.len});
    }

    for (int u = 1; u <= N; u++) {
        if (seen[u] == false) {
            dfs(u);
            int v1, v2, len; tie(v1, v2, len) = backEdge;
            swap(v1, v2);
            par[v2] = Edge{v1, len};
            rootGroups.push_back({});
            int v = v1;
            while (v != v2) {
                root[v] = true;
                rootGroups.back().push_back(v);
                v = par[v].to;
            }
            root[v] = true;
            rootGroups.back().push_back(v);
        }
    }

    fill(seen + 1, seen + N + 1, false);
    for (int u = 1; u <= N; u++) {
        if (root[u] == true) {
            compute(u);
        }
    }

    ll answer = 0;
    for (vector <int> &roots : rootGroups) {
        ll totalLen = 0;
        ll maxLen = 0;
        for (int u : roots) {
            totalLen += par[u].len;
            maxLen = max(maxLen, maxAny[u]);
        }

        multiset <ll> s; ll len = 0;
        for (int i = (int) roots.size() - 1; i > 0; i--) {
            len += par[roots[i]].len;
            s.insert(maxDown[roots[i]] + len);
        }
        ll lazy = 0;

        for (int i = 0, u = roots[0]; i < (int) roots.size(); i++) {
            maxLen = max(maxLen, *s.rbegin() + lazy + maxDown[u]);
            s.insert(maxDown[u] - lazy);
            lazy += par[u].len;
            u = par[u].to;
            s.erase(s.find((maxDown[u] + totalLen) - lazy));
        }
        answer += maxLen;
    }
    cout << answer << "\n";

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 23764 KB Output is correct
2 Correct 12 ms 23764 KB Output is correct
3 Correct 12 ms 23916 KB Output is correct
4 Correct 12 ms 23768 KB Output is correct
5 Correct 13 ms 23764 KB Output is correct
6 Correct 16 ms 23788 KB Output is correct
7 Correct 12 ms 23812 KB Output is correct
8 Correct 13 ms 23812 KB Output is correct
9 Correct 12 ms 23764 KB Output is correct
10 Correct 12 ms 23764 KB Output is correct
11 Correct 13 ms 23780 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 23900 KB Output is correct
2 Correct 13 ms 23892 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 23960 KB Output is correct
2 Correct 14 ms 24404 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 25300 KB Output is correct
2 Correct 35 ms 28360 KB Output is correct
3 Correct 23 ms 25548 KB Output is correct
4 Correct 18 ms 24672 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 46 ms 30064 KB Output is correct
2 Correct 71 ms 33648 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 97 ms 41692 KB Output is correct
2 Correct 135 ms 47768 KB Output is correct
3 Correct 177 ms 61256 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 183 ms 56964 KB Output is correct
2 Correct 256 ms 85776 KB Output is correct
3 Correct 420 ms 92356 KB Output is correct
4 Correct 440 ms 119884 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 362 ms 92004 KB Output is correct
2 Runtime error 707 ms 131072 KB Execution killed with signal 9
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 347 ms 131072 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -