Submission #477099

#TimeUsernameProblemLanguageResultExecution timeMemory
477099EIMONIMMeetings 2 (JOI21_meetings2)C++14
100 / 100
552 ms42516 KiB
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> ii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef vector<bool> vb;
typedef vector<vb> vvb;
#define x first
#define y second
#define pb push_back
#define loop(i,s,e) for(int i=(s);i<(e);i++)
#define loopr(i,s,e) for(int i=(e)-1;i>=(s);i--)
#define chkmax(a,b) a = max(a,b)
#define chkmin(a,b) a = min(a,b)
#define all(x) x.begin(),x.end()
const int INF = 1e9, MOD = 1e9 + 7;

template <class A, class B> pair<A,B> operator+(pair<A,B>& a, pair<A,B>& b) {
    return {a.x+b.x, a.y+b.y}; }
template <class A, class B> pair<A,B> operator-(pair<A,B>& a, pair<A,B>& b) {
    return {a.x-b.x, a.y-b.y}; }
template <class A, class B> istream& operator>>(istream& is, pair<A,B>& a) {
    return is >> a.x >> a.y; }
template <class A, class B> ostream& operator << (ostream& os, const pair<A,B>& a) {
    return os << "< " << a.x << " , " << a.y << " >"; }

template<class T> ostream &operator<<(ostream &os, vector<T> v) { os << '['; if (!v.empty()) { os << v[0]; loop(i, 1, v.size()) os << ',' << v[i]; } return os << ']'; }
template<class T> ostream &operator<<(ostream &os, set<T> v) { os << '{'; if (!v.empty()) { os << *v.begin(); for(auto it = ++v.begin(); it != v.end(); ++it) os << ',' << *it; } return os << '}'; }

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
auto DIST = uniform_int_distribution<int>(0, INF);


int n;
vi sz;
vvi g;
vi ans;
vvi dp;
int dfssz(int cur, int p=-1){
	for(int nei:g[cur]) if(nei!=p) sz[cur]+=dfssz(nei, cur);
	return ++sz[cur];
}
int cent(int cur, int p=-1){
	for(int nei:g[cur]) if(nei!=p && 2*sz[nei]>=n) return cent(nei, cur);
	return cur;
}
void merge(int a, int b, int curd){
	if (dp[a].size()<dp[b].size()) swap(dp[a], dp[b]);
	loop(i,1,dp[b].size()){
		chkmax(ans[2*i], dp[a][i] + dp[b][i] - 2 * curd+1);
		chkmax(dp[a][i], dp[b][i]);
	}
	loop(i,1,dp[b].size()) dp[a].pb(curd);
}
void dfs(int cur, int p=-1, int d=0){
	vii ch;
	for(int nei:g[cur]) if(nei!=p){
		dfs(nei, cur, d+1);
		ch.pb({dp[nei].size(), nei});
	}
	sort(all(ch));
	dp[cur] = {-1, d};
	for(auto c:ch) merge(cur, c.y, d);
}
int32_t main(int argc, char *argv[]){
    ios_base::sync_with_stdio(false);
	cin >> n; g = vvi(n);
	loop(i,1,n){
		int a,b; cin>>a>>b; a--, b--;
		g[a].pb(b), g[b].pb(a);
	}
	sz = vi(n);
	dfssz(0);
	int r = cent(0);
	ans = vi(n+1,1), dp = vvi(n);
	dfs(r);
	loop(i,1,n+1) cout<<ans[i]<<endl;
    return 0;
}
/*
color a
cls
g++ sol.cpp -o a & a
5
1 2
2 3
4 2
3 5


*/ 

Compilation message (stderr)

meetings2.cpp: In function 'void merge(int, int, int)':
meetings2.cpp:13:36: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   13 | #define loop(i,s,e) for(int i=(s);i<(e);i++)
      |                                    ^
meetings2.cpp:51:2: note: in expansion of macro 'loop'
   51 |  loop(i,1,dp[b].size()){
      |  ^~~~
meetings2.cpp:13:36: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   13 | #define loop(i,s,e) for(int i=(s);i<(e);i++)
      |                                    ^
meetings2.cpp:55:2: note: in expansion of macro 'loop'
   55 |  loop(i,1,dp[b].size()) dp[a].pb(curd);
      |  ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...