답안 #392957

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
392957 2021-04-22T12:30:52 Z asbsfds Torrent (COI16_torrent) C++14
100 / 100
550 ms 25812 KB
#include <bits/stdc++.h>
#define X first
#define Y second

using namespace std;
typedef long long llint;

const int maxn = 3e5+10;
const int base = 31337;
const int mod = 1e9+7;
const int inf = 0x3f3f3f3f;
const int logo = 20;
const int off = 1 << logo;
const int treesiz = off << 1;

int n, a, b;
vector< int > graph[maxn];
int dp[maxn];
vector< int > v;

bool dfs(int x, int parr) {
	bool out = (x == b);
	for (int i = 0; i < graph[x].size(); i++) {
		int tren = graph[x][i];
		if (tren == parr) continue;
		out |= dfs(tren, x);
	}
	if (out) v.push_back(x);
	return out;
}

int ax, ay;
bool check(int x, int y) {
	if (x == ax && y == ay) return false;
	if (x == ay && y == ax) return false;
	return true;
}

int f(int x, int parr) {
	int out = 0;
	vector< int > v;
	
	for (int i = 0; i < graph[x].size(); i++) {
		int tren = graph[x][i];
		if (tren == parr || !check(x, tren)) continue;
		v.push_back(f(tren, x));
	}
	sort(v.begin(), v.end());
	reverse(v.begin(), v.end());
	
	for (int i = 0; i < v.size(); i++) {
		out = max(out, i + 1 + v[i]);
	}
	return out;
}

pair<int, int> solve(int x, int y) {
	ax = x, ay = y;
	int aa = f(a, -1);
	int bb = f(b, -1);
	return make_pair(aa, bb);
}

int main() {
	scanf("%d%d%d", &n, &a, &b);
	for (int i = 1; i < n; i++) {
		int x, y;
		scanf("%d%d", &x, &y);
		graph[x].push_back(y);
		graph[y].push_back(x);
	}
	
	dfs(a, -1);
	reverse(v.begin(), v.end());
	
	int lo = 0, hi = v.size() - 2;
	while (lo < hi) {
		int mid = (lo + hi + 1) / 2;
		pair<int, int> tren = solve(v[mid], v[mid + 1]);
		if (tren.X <= tren.Y) lo = mid;
		else hi = mid - 1;
	}
	
	//for (int i = 0; i < v.size(); i++) printf("%d ", v[i]); printf("\n");
	
	int sol = inf;
	for (int i = -1; i < 2; i++) {
		int tr = lo + i;
		if (tr >= 0 && tr + 1 <= v.size() - 1) {
			pair<int, int> tren = solve(v[tr], v[tr + 1]);
			//printf("trying: %d %d\n", v[tr], v[tr + 1]);
			//printf("debug: %d %d\n", tren.X, tren.Y);
			sol = min(sol, max(tren.X, tren.Y));
		}
	}
	printf("%d\n", sol);
	return 0;
}

Compilation message

torrent.cpp: In function 'bool dfs(int, int)':
torrent.cpp:23:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   23 |  for (int i = 0; i < graph[x].size(); i++) {
      |                  ~~^~~~~~~~~~~~~~~~~
torrent.cpp: In function 'int f(int, int)':
torrent.cpp:43:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |  for (int i = 0; i < graph[x].size(); i++) {
      |                  ~~^~~~~~~~~~~~~~~~~
torrent.cpp:51:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   51 |  for (int i = 0; i < v.size(); i++) {
      |                  ~~^~~~~~~~~~
torrent.cpp: In function 'int main()':
torrent.cpp:89:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |   if (tr >= 0 && tr + 1 <= v.size() - 1) {
      |                  ~~~~~~~^~~~~~~~~~~~~~~
torrent.cpp:65:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   65 |  scanf("%d%d%d", &n, &a, &b);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~
torrent.cpp:68:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   68 |   scanf("%d%d", &x, &y);
      |   ~~~~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 7372 KB Output is correct
2 Correct 5 ms 7372 KB Output is correct
3 Correct 5 ms 7372 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 534 ms 20100 KB Output is correct
2 Correct 550 ms 24096 KB Output is correct
3 Correct 493 ms 25484 KB Output is correct
4 Correct 498 ms 25088 KB Output is correct
5 Correct 507 ms 22660 KB Output is correct
6 Correct 445 ms 23144 KB Output is correct
7 Correct 427 ms 25812 KB Output is correct