提出 #73542789


ソースコード 拡げる

#include <bits/stdc++.h>
#ifndef LOCAL
#include <atcoder/all>
#endif
using namespace std;
using i64 = long long;
#define int i64
#define rep(i, j, k) for(int i = (j); i <= (k); i++)
#define per(i, j, k) for(int i = (j); i >= (k); i--)
#define pb emplace_back
#define fi first
#define se second
using vi = vector<int>;
using pi = pair<int, int>;

template<typename T0, typename T1> bool chmin(T0 &x, const T1 &y){
	if(y < x){x = y; return true;} return false;
}
template<typename T0, typename T1> bool chmax(T0 &x, const T1 &y){
	if(x < y){x = y; return true;} return false;
}

template<typename T> ostream& operator << (ostream& os, const vector<T> &vec){
	os << "[";
	for(size_t i = 0; i < vec.size(); i ++){
		if(i > 0) os << ", ";
		os << vec[i];
	}
	os << "]";
	return os;
}

template<typename T> void debug(char *s, T x){
	cerr << s <<" = "<< x <<endl;
}
template<typename T, typename ...Ar> void debug(char *s, T x, Ar... y){
	int dep = 0;
	while(!(*s == ',' && dep == 0)){
		if(*s == '(') dep++;
		if(*s == ')') dep--;
		cerr << *s++;
	}
	cerr <<" = "<< x <<",";
	debug(s + 1, y...);
}
#define gdb(...) debug((char*)#__VA_ARGS__, __VA_ARGS__)

vi conv(vi a, vi b){
	#ifdef LOCAL
	vi res(a.size() + b.size() - 1);
	rep(i, 0, int(a.size()) - 1){
		rep(j, 0, int(b.size()) - 1){
			res[i + j] += a[i] * b[j];
		}
	}
	return res;
	#else
	return atcoder::convolution_ll(a, b);
	#endif
}

signed main(){
	#ifdef LOCAL
	assert( freopen(".in", "r", stdin) );
	assert( freopen(".out", "w", stdout) );
	#endif
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	int n;
	cin >> n;
	vector<vi> G(n);
	rep(i, 0, n - 2){
		int u, v;
		cin >> u >> v;
		u --, v --;
		G[u].pb(v);
		G[v].pb(u);
	}
	vi mnd(n, -1);
	{
		queue<int> Q;
		vi deg(n);
		rep(i, 0, n - 1){
			deg[i] = G[i].size();
		}
		rep(i, 0, n - 1){
			if(deg[i] <= 1){
				mnd[i] = 0;
				Q.emplace(i);
			}
		}
		while(Q.size()){
			int u = Q.front();
			Q.pop();
			deg[u] = 0;
			for(int v:G[u]){
				if(deg[v] >= 1){
					chmax(mnd[v], mnd[u] + 1);
					deg[v] --;
					if(deg[v] == 1){
						Q.emplace(v);
					}
				}
			}
		}
	}

	int R = -1;
	{
		auto chk = [&](int d){
			rep(u, 0, n - 1){
				int deg = 0;
				for(int v:G[u]){
					deg += (mnd[v] >= d);
				}
				if(deg > 2){
					return false;
				}
			}
			return true;
		};
		int l = 0, r = n;
		while(l + 1 < r){
			int mid = (l + r) / 2 - 1;
			if(chk(mid)){
				r = mid + 1;
			} else{
				l = mid + 1;
			}
		}
		R = l;
	}
	auto solve_dis = [&](int R){
		vi ok(n);
		rep(i, 0, n - 1){
			ok[i] = (mnd[i] >= R);
		}
		vi P;
		{
			int rt = -1;
			rep(u, 0, n - 1){
				if(!ok[u]){
					continue;
				}
				int deg = 0;
				for(int v:G[u]){
					deg += ok[v];
				}
				if(deg <= 1){
					rt = u;
				}
				if(deg > 2){
					return vi(n + 1, 0);
				}
			}
			assert(~rt);
			auto dfs = [&](auto &self, int u, int p)->void {
				P.pb(u);
				for(int v:G[u]){
					if(v != p && ok[v]){
						self(self, v, u);
					}
				}
			};
			dfs(dfs, rt, -1);
		}
		auto get_vec = [&](int u, int p)->vi {
			vi res;
			auto dfs = [&](auto &self, int u, int p, int d)->void {
				while(int(res.size()) <= d){
					res.pb(0);
				}
				res[d] ++;
				for(int v:G[u]){
					if(v != p){
						self(self, v, u, d + 1);
					}
				}
			};
			dfs(dfs, u, p, 0);
			return res;
		};

		vi ans(n * 2 + 1);
		if(P.size() == 1){
			int u = P[0];
			vi t = get_vec(u, -1);
			t = conv(t, t);
			rep(i, 0, int(t.size()) - 1){
				ans[i] += t[i];
			}
			for(int v:G[u]){
				vi t = get_vec(v, u);
				t.insert(t.begin(), 0);
				t = conv(t, t);
				rep(i, 0, int(t.size()) - 1){
					ans[i] -= t[i];
				}
			}
			ans[0] ++;
			rep(i, 0, int(ans.size()) - 1){
				ans[i] /= 2;
			}
		} else{
			vi a = get_vec(P[0], P[1]);
			vi b = get_vec(P.end()[-1], P.end()[-2]);
			vi c = conv(a, b);
			rep(i, 0, int(c.size()) - 1){
				ans[i] += c[i];
			}
		}
		vi res(n + 1);
		int len = P.size();
		rep(i, 1, n){
			res[i] = (i < len? 0: ans[i - len]);
		}
		return res;
	};
	vi ans0 = solve_dis(R);
	// vi ans1 = solve_dis(R - 1);
	rep(i, 1, n){
		cout << ans0[i] <<'\n';
	}
}

提出情報

提出日時
問題 F - Scapus
ユーザ bananabot
言語 C++23 (GCC 15.2.0)
得点 700
コード長 4285 Byte
結果 AC
実行時間 230 ms
メモリ 42936 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 700 / 700
結果
AC × 3
AC × 34
セット名 テストケース
Sample 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt
All 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt, edge-12.txt, edge-13.txt, edge-14.txt, edge-16.txt, edge-17.txt, edge-18.txt, edge-23.txt, edge-24.txt, edge-29.txt, edge-30.txt, edge-31.txt, random-01.txt, random-02.txt, random-03.txt, random-04.txt, random-05.txt, random-06.txt, random-07.txt, random-08.txt, random-09.txt, random-10.txt, random-11.txt, vertex-15.txt, vertex-19.txt, vertex-20.txt, vertex-21.txt, vertex-22.txt, vertex-25.txt, vertex-26.txt, vertex-27.txt, vertex-28.txt
ケース名 結果 実行時間 メモリ
00_sample_01.txt AC 1 ms 3568 KiB
00_sample_02.txt AC 1 ms 3568 KiB
00_sample_03.txt AC 1 ms 3668 KiB
edge-12.txt AC 1 ms 3696 KiB
edge-13.txt AC 1 ms 3596 KiB
edge-14.txt AC 109 ms 42936 KiB
edge-16.txt AC 85 ms 34308 KiB
edge-17.txt AC 90 ms 35212 KiB
edge-18.txt AC 94 ms 29296 KiB
edge-23.txt AC 103 ms 30776 KiB
edge-24.txt AC 60 ms 23612 KiB
edge-29.txt AC 95 ms 29236 KiB
edge-30.txt AC 92 ms 29144 KiB
edge-31.txt AC 95 ms 29164 KiB
random-01.txt AC 87 ms 24012 KiB
random-02.txt AC 86 ms 23836 KiB
random-03.txt AC 86 ms 24000 KiB
random-04.txt AC 83 ms 23416 KiB
random-05.txt AC 87 ms 23996 KiB
random-06.txt AC 88 ms 24000 KiB
random-07.txt AC 96 ms 24004 KiB
random-08.txt AC 92 ms 23884 KiB
random-09.txt AC 100 ms 23512 KiB
random-10.txt AC 89 ms 23480 KiB
random-11.txt AC 81 ms 24040 KiB
vertex-15.txt AC 118 ms 23752 KiB
vertex-19.txt AC 230 ms 35392 KiB
vertex-20.txt AC 183 ms 31384 KiB
vertex-21.txt AC 191 ms 29164 KiB
vertex-22.txt AC 191 ms 27784 KiB
vertex-25.txt AC 159 ms 25508 KiB
vertex-26.txt AC 159 ms 24988 KiB
vertex-27.txt AC 172 ms 24636 KiB
vertex-28.txt AC 182 ms 24356 KiB