$O(n)$
아무 노드 하나를 루트로 하는 rooted tree를 만든다.
r[i]: i번 버스 정류장에 멈추는 버스의 수
aj: i번 노드의 j(<=m)번째 자식의 자손 수
sj=sum(a[1...j])
r[i]={sum((sj+1)*a[j])+(sm+1)*(n-sm-1)}*2 이다.
#include<cstdio> #include<vector> using namespace std; const int MXN = 1e6; typedef long long ll; int n; vector<int> adj[MXN + 1]; ll r[MXN + 1]; int f(int h, int p) { ll s = 1; for (auto it : adj[h]) if (it^p) { int t = f(it, h); r[h] += s*t; s += t; } r[h] += s*(n - s); return s; } int main() { scanf("%d", &n); for (int i = 0, x, y; i<n - 1; i++) { scanf("%d%d", &x, &y); adj[x].push_back(y); adj[y].push_back(x); } f(1, 0); for (int i = 1; i <= n; i++) printf("%lld\n", r[i] * 2); return 0; }
댓글 없음 :
댓글 쓰기