Submission #743550

#TimeUsernameProblemLanguageResultExecution timeMemory
743550lukadupliTorrent (COI16_torrent)C++14
100 / 100
613 ms25800 KiB
#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 (stderr)

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);
      |                    ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...