提出 #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 |
| 結果 |
|
|
| セット名 |
テストケース |
| 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 |