답안 #743550

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
743550 2023-05-17T13:42:35 Z lukadupli Torrent (COI16_torrent) C++14
100 / 100
613 ms 25800 KB
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 3e5 + 5;

int n, a, b, xe, ye;
vector<int> adj[MAXN];

int dfs(int node, int parent = -1){
    int res = 0;

    vector<int> v;
    for(int nxt : adj[node]){
        if(nxt != parent &&
           (min(xe, ye) != min(node, nxt) || max(xe, ye) != max(node, nxt))) v.push_back(dfs(nxt, node));
    }

    sort(v.begin(), v.end(), greater<int>());

    for(int i = 0; i < v.size(); i++) res = max(res, v[i] + i + 1);

    return res;
}

vector<int> path;
bool found = 0;
void dfs2(int node, int parent = -1){
    path.push_back(node);
    if(node == b){
        found = 1;
        return;
    }

    for(int nxt : adj[node]){
        if(nxt != parent) dfs2(nxt, node);
        if(found) return;
    }

    path.pop_back();
}


int main()
{
    cin >> n >> a >> b;
    for(int i = 0; i < n - 1; i++){
        int x, y;
        cin >> x >> y;

        adj[x].push_back(y);
        adj[y].push_back(x);
    }

    dfs2(a, -1);

    int l = 0, r = path.size() - 2;
    while(r > l){
        int m = (l + r) / 2;

        xe = path[m]; ye = path[m + 1];
        int A = dfs(a), B = dfs(b);

        if(A < B) l = m + 1;
        else r = m;
    }

    xe = path[l]; ye = path[l + 1];
    int s1 = max(dfs(a), dfs(b));

    int s2 = 1e9;
    if(l > 0){
        xe = path[l - 1]; ye = path[l];
        s2 = max(dfs(a), dfs(b));
    }

    cout << min(s1, s2);

	return 0;
}

Compilation message

torrent.cpp: In function 'int dfs(int, int)':
torrent.cpp:21:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   21 |     for(int i = 0; i < v.size(); i++) res = max(res, v[i] + i + 1);
      |                    ~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 7380 KB Output is correct
2 Correct 7 ms 7352 KB Output is correct
3 Correct 5 ms 7352 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 574 ms 23024 KB Output is correct
2 Correct 593 ms 24140 KB Output is correct
3 Correct 534 ms 25496 KB Output is correct
4 Correct 538 ms 24948 KB Output is correct
5 Correct 613 ms 22508 KB Output is correct
6 Correct 510 ms 23084 KB Output is correct
7 Correct 521 ms 25800 KB Output is correct