Submission #209894

#TimeUsernameProblemLanguageResultExecution timeMemory
209894alishahali1382Torrent (COI16_torrent)C++14
31 / 100
147 ms28536 KiB
#include <bits/stdc++.h>
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<pii, int> piii;
typedef pair<ll, ll> pll;
#define debug(x) cerr<<#x<<'='<<(x)<<endl;
#define debugp(x) cerr<<#x<<"= {"<<(x.first)<<", "<<(x.second)<<"}"<<endl;
#define debug2(x, y) cerr<<"{"<<#x<<", "<<#y<<"} = {"<<(x)<<", "<<(y)<<"}"<<endl;
#define debugv(v) cerr<<#v<<" : ";for (auto x:v) cerr<<x<<' ';cerr<<endl;
#define all(x) x.begin(), x.end()
#define pb push_back
#define kill(x) return cout<<x<<'\n', 0;

const ld eps=1e-7;
const int inf=1000000010;
const ll INF=10000000000000010LL;
const int mod = 1000000007;
const int MAXN = 500010;

int n, m, k, q, u, v, x, y, t, a, b, len;
int dp[MAXN];
bool on_path[MAXN];
vector<int> G[MAXN];
vector<int> path;

bool dfs_path(int node, int par){
	path.pb(node);
	if (node==b) return 1;
	for (int v:G[node]) if (v!=par && dfs_path(v, node)) return 1;
	path.pop_back();
	return 0;
}

int dfs_dp(int node, int par){
	vector<int> vec;
	for (int v:G[node]) if (!on_path[v] && v!=par) vec.pb(dfs_dp(v, node));
	sort(all(vec));
	reverse(all(vec));
	for (int i=0; i<vec.size(); i++) dp[node]=max(dp[node], vec[i]+i+1);
	return dp[node];
}

int check(int val){
	int cnt=0, tmp=val;
	for (int i=0; i<=len; i++){
		if (dp[path[i]]<tmp) tmp--, cnt++;
		else if (dp[path[i]]==tmp) {cnt++; break ;}
		else break ;
	}
	tmp=val;
	for (int i=len; i>=0; i--){
		if (dp[path[i]]<tmp) tmp--, cnt++;
		else if (dp[path[i]]==tmp) {cnt++; break ;}
		else break ;
	}

	return cnt>=len+1;
}

int main(){
	ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	//freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
	cin>>n>>a>>b;
	for (int i=1; i<n; i++){
		cin>>u>>v;
		G[u].pb(v);
		G[v].pb(u);
	}
	dfs_path(a, a);
	len=path.size()-1;
	for (int v:path) on_path[v]=1;
	for (int v:path) dfs_dp(v, v);

	int dwn=-1, up=n;
	while (up-dwn>1){
		int mid=(dwn+up)>>1;
		if (check(mid)) up=mid;
		else dwn=mid;
	}
	cout<<up<<'\n';

	return 0;
}
/*
6 2 1
1 2
2 3
2 4
1 5
5 6


10 1 2
1 2
2 5
1 3
1 4
4 6
6 7
3 8
3 9
3 10


17 1 2
1 3
1 4
4 6
6 7
3 8
3 9
3 10
1 13
13 5
13 11
13 12
13 14
14 15
15 16
15 17
14 2

*/

Compilation message (stderr)

torrent.cpp: In function 'int dfs_dp(int, int)':
torrent.cpp:45:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i=0; i<vec.size(); i++) dp[node]=max(dp[node], vec[i]+i+1);
                ~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...