#include<bits/stdc++.h> using namespace std; #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout); #define LL long long #define ULL unsigned LL #define fi first #define se second #define pb push_back #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define lch(x) tr[x].son[0] #define rch(x) tr[x].son[1] #define max3(a,b,c) max(a,max(b,c)) #define min3(a,b,c) min(a,min(b,c)) typedef pair<int,int> pll; const int inf = 0x3f3f3f3f; const int _inf = 0xc0c0c0c0; const LL INF = 0x3f3f3f3f3f3f3f3f; const LL _INF = 0xc0c0c0c0c0c0c0c0; const LL mod = (int)1e9+7; const int N = 1e5 + 100; const int M = N<<1; struct Tree{ int head[N], to[M], nt[M]; int sz[N], son[N], deep[N], top[N], fa[N], dfn[N], dto[N]; int tr[N<<2], lz[N<<2], sum[N<<2]; int a[N]; int tot, dtot; int n; void add(int u, int v){ to[tot] = v; nt[tot] = head[u]; head[u] = tot++; to[tot] = u; nt[tot] = head[v]; head[v] = tot++; } void dfs1(int o, int u){ sz[u] = 1; for(int i = head[u]; ~i; i = nt[i]){ int v = to[i]; if(v == o) continue; dfs1(u, v); if(sz[v] > sz[son[u]]) son[u] = v; sz[u] += sz[v]; } } void dfs2(int o, int u, int t){ deep[u] = deep[o] + 1; top[u] = t; fa[u] = o; dfn[u] = ++dtot; dto[dtot] = u; if(son[u]) dfs2(u, son[u], t); for(int i = head[u]; ~i; i = nt[i]){ int v = to[i]; if(v == o || v == son[u]) continue; dfs2(u, v, v); } } void PushUp(int rt){ sum[rt] = sum[rt<<1|1] + sum[rt<<1]; return ; } void PushDown(int rt){ return ; } void Build(int l, int r,int rt){ if(l == r){ tr[rt] = a[dto[l]]; return ; } int m = l+r >> 1; Build(lson); Build(rson); PushUp(rt); } int Query_Seg(int L, int R, int l, int r, int rt){/// dfn调用 if(L > R) return 0; if(L <= l && r <= R) return sum[rt]; int m = l+r >> 1; int ret = 0; PushDown(rt); if(L <= m) ret += Query_Seg(L, R, lson); if(m < R) ret += Query_Seg(L, R, rson); return ret; } int Query_Path(int x, int y){///点调用 int fx = top[x], fy = top[y]; int ret = 0; while(fx != fy){ if(deep[fx] > deep[fy]){ ret += Query_Seg(dfn[fx],dfn[x],1,n,1); x = fa[fx]; fx = top[x]; } else { ret += Query_Seg(dfn[fy],dfn[y],1,n,1); y = fa[fy]; fy = top[y]; } } if(deep[x] < deep[y]) ret += Query_Seg(dfn[x]+1, dfn[y], 1, n, 1); else ret += Query_Seg(dfn[y]+1, dfn[x], 1, n,1); return ret; } void Updata_Seg(int L, int R, int C, int l, int r, int rt){ /// dfn调用 if(L <= l && r <= R){ tr[rt] = C; sum[rt] = C; return ; } int m = l+r >> 1; PushDown(rt); if(L <= m) Updata_Seg(L, R, C, lson); if(m < R) Updata_Seg(L, R, C, rson); PushUp(rt); return ; } void Updata_Path(int x, int y, int c){///点调用 int fx = top[x], fy = top[y]; int ret = 0; while(fx != fy){ if(deep[fx] > deep[fy]){ Updata_Seg(dfn[fx], dfn[x], c, 1, n, 1); x = fa[fx]; fx = top[x]; } else { Updata_Seg(dfn[fy],dfn[y],c,1,n,1); y = fa[fy]; fy = top[y]; } } if(deep[x] < deep[y]) Updata_Seg(dfn[x], dfn[y], c, 1, n, 1); else Updata_Seg(dfn[y], dfn[x], c, 1, n,1); } int lca(int x, int y){ int fx = top[x], fy = top[y]; while(fx != fy){ if(deep[fx] > deep[fy]) x = fa[fx], fx = top[x]; else y = fa[fy], fy = top[y]; } if(deep[x] < deep[y]) return x; return y; } int caldis(int x, int y){ return deep[x] + deep[y] - 2 * deep[lca(x,y)]; } void init(int x){ memset(head, -1, sizeof(head)); memset(son, 0, sizeof son); tot = dtot = 0; n = x; }; }tree; int main(){ int n; scanf("%d", &n); tree.init(n); int u, v; for(int i = 1; i < n; ++i){ scanf("%d%d", &u, &v); tree.add(u, v); } tree.dfs1(0, 1); tree.dfs2(0, 1, 1); tree.Build(1, n, 1); return 0; }