結果
| 問題 |
No.1098 LCAs
|
| コンテスト | |
| ユーザー |
i_am_nicolen_22
|
| 提出日時 | 2020-06-27 02:30:11 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,102 bytes |
| コンパイル時間 | 1,641 ms |
| コンパイル使用メモリ | 176,108 KB |
| 実行使用メモリ | 28,624 KB |
| 最終ジャッジ日時 | 2024-07-05 06:19:43 |
| 合計ジャッジ時間 | 7,635 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 20 TLE * 1 -- * 7 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define REP(i, s) for (int i = 0; i < s; ++i)
#define ALL(v) (v).begin(), (v).end()
#define COUT(x) cout << #x << " = " << (x) << " (L" << __LINE__ << ")" << endl
#define EACH(i, s) for (__typeof__((s).begin()) i = (s).begin(); i != (s).end(); ++i)
#define DEBUG
#define int long long
#define INF 1e18
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
template<class T1, class T2> ostream& operator << (ostream &s, pair<T1,T2> P)
{ return s << '<' << P.first << ", " << P.second << '>'; }
template<class T> ostream& operator << (ostream &s, vector<T> P)
{ for (int i = 0; i < P.size(); ++i) { if (i > 0) { s << " "; } s << P[i]; } return s; }
template<class T> ostream& operator << (ostream &s, vector<vector<T> > P)
{ for (int i = 0; i < P.size(); ++i) { s << endl << P[i]; } return s << endl; }
template<class T> ostream& operator << (ostream &s, set<T> P)
{ EACH(it, P) { s << "<" << *it << "> "; } return s << endl; }
template<class T1, class T2> ostream& operator << (ostream &s, map<T1,T2> P)
{ EACH(it, P) { s << "<" << it->first << "->" << it->second << "> "; } return s << endl; }
template<class T>void show(vector<T>v){for (int i = 0; i < v.size(); i++){cerr<<v[i]<<" ";}cerr<<"\n";}
typedef long long ll;
using Graph=vector<vector<int>>;
Graph G;
vector<int> depth;
vector<int> subtree_size;
vector<int>ans;
void dfs(const Graph &G, int v, int p, int d)
{
depth[v] = d;
for (auto nv : G[v])
{
if (nv == p)
continue; // nv が親 p だったらダメ
dfs(G, nv, v, d + 1);
}
// 帰りがけ時に、部分木サイズを求める
subtree_size[v] = 1; // 自分自身
for (auto c : G[v])
{
if (c == p)
continue;
subtree_size[v] += subtree_size[c]; // 子のサイズを加える
}
int cnt=1;
int sum=0;
int r=0;
vector<int>a;
for(auto & u : G[v]){
if(u == p){
continue;
}
//cnt*=subtree_size[u];
r+=subtree_size[u];
a.push_back(subtree_size[u]);
sum++;
}
if(sum==0){
ans[v]=1;
}
else if(sum==1){
ans[v]=r*2+1;
}
else {
int cnt=0;
for (int i = 0; i < a.size(); i++)
{
for (int j = 0; j < a.size(); j++)
{
if(i==j){
continue;
}
cnt+=a[i]*a[j];
}
}
ans[v]=cnt+1+2*r;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
G.assign(n,vector<int>());
depth.resize(n,0);
subtree_size.resize(n,0);
ans.resize(n);
for (int i = 0; i < n-1; i++)
{
int u,v;
cin>>u>>v;
u--,v--;
G[u].push_back(v);
G[v].push_back(u);
}
dfs(G,0,-1,0);
for (int i = 0; i < n; i++)
{
cout<<ans[i]<<endl;
}
return 0;
}
i_am_nicolen_22