Submission #341280

#TimeUsernameProblemLanguageResultExecution timeMemory
341280TosicHard route (IZhO17_road)C++14
52 / 100
595 ms64260 KiB
#include <bits/stdc++.h>
#define maxn 5010
using namespace std;

int n, ans, cnt, maxO[maxn], iT[maxn], oT[maxn], gT;
vector<int> dp[maxn];
vector<vector<int>> gr;

void dfs(int x, int p){
	iT[x] = gT;
	++gT;
	dp[x].push_back(0);
	for(auto i:gr[x]){
		if(i ==p){
			continue;
		}
		dfs(i, x);
		dp[x].push_back(dp[i].back()+1);
	}
	sort(dp[x].begin(), dp[x].end());
	oT[x] = gT;
	++gT;
}

void dfs1(int cur, int p, int x, int d){
	if(iT[cur] > iT[x] and oT[cur] < oT[x]){
		return;
	}
	maxO[x] = max(maxO[x], d);
	
	
	for(auto i : gr[cur]){
		if(i==p){
			continue;
		}
		dfs1(i, cur, x, d+1);
	}
}

bool isA(int x, int y){
	return iT[x] < iT[y];
}

bool isL(int x){
	return gr[x].size()==1;
}

void cDfs(int x, int p, bool up, int d, int res){
	if(p != -1 and isL(x)){
		if(ans == d*res){
			++cnt;
		}
		if(ans < d*res){
			cnt = 1;
			ans = d*res;
		}
		return;
	}
	for(auto i : gr[x]){
		if(i != p){
			if(isA(x, i) and up){
				int idx = int(dp[x].size())-1;
				if(dp[x][idx] == max(dp[i].back()+1,dp[p].back()+1) ){
					--idx;
				}
				if(dp[x][idx] == min(dp[p].back()+1,dp[i].back()+1) ){
					--idx;
				}
				int tmpRes = max(res, dp[x][idx]);
				tmpRes = max(tmpRes, maxO[x]);
				cDfs(i, x, 0, d+1, tmpRes);
			} else {
				int idx = int(dp[x].size())-1, tmpRes;
				if(up){
					if(p >= 0 and dp[x][idx] == dp[p].back()+1){
						--idx;
					}
					tmpRes = max(res, dp[x][idx]);
				} else {
					if(dp[x][idx] == dp[i].back()+1){
						--idx;
					}
					tmpRes = max(res, dp[x][idx]);
				}
				cDfs(i, x, up, d+1, tmpRes);
			}
		}
	}
}

int main(){
	ios_base::sync_with_stdio(0);
	cout.tie(0);
	cin.tie(0);
	cin >> n;
	gr.resize(n, vector<int>());
	for(int i = 0; i < n-1; ++i){
		int u, v;
		cin >> u >> v;
		--u,--v;
		gr[u].push_back(v);
		gr[v].push_back(u);
	}
	if(n == 2){
		cout << "0 1";
		return 0;
	}
	for(int i = 0; i < n; ++i){
		if(!isL(i)){
			dfs(i, -1);
			break;
		}
	}
	for(int i = 0; i < n; ++i){
		dfs1(i, -1, i, 0);
	}
	for(int i = 0; i < n; ++i){
		if(isL(i)){
			cDfs(i, -1, 1, 0, 0);
		}
	}
	cout<<ans<<' '<<cnt/2<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...