提交时间:2025-01-06 08:24:31
运行 ID: 35864
#include<bits/stdc++.h> using namespace std; #define int long long #define lson (pos<<1) #define rson (pos<<1|1) #define inx(u) int I=h[(u)],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v #define pb push_back int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=100010,N=20; struct Edge{int v,nx;}edge[MAXN<<1];int h[MAXN],CNT;void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;edge[++CNT]={u,h[v]};h[v]=CNT;} int n,m,sum,a[MAXN],len,dfn[MAXN],ed[MAXN],dy[MAXN],cnt,dep[MAXN],fa[MAXN][N+3],f[MAXN],g[MAXN],d[MAXN]; vector<int>I[MAXN],D[MAXN]; void dfs(int u,int lst){ len=max(len,dep[u]); fa[u][0]=lst,d[u]=1; f[u]=0,g[u]=n+1,dfn[u]=++cnt,dy[cnt]=u; for(inx(u))if(v!=lst)dep[v]=dep[u]+1,dfs(v,u),d[u]++,f[u]=max(f[u],f[v]+1),g[u]=min(g[u],g[v]+1); if(d[u]==1)f[u]=g[u]=0; else I[g[u]].pb(u),D[f[u]+1].pb(u); ed[u]=cnt; } int as[MAXN]; bool cmp(int x,int y){return dep[x]<dep[y];} int qry(int u,int k){ for(int i=N;~i;i--)if(k&(1<<i))u=fa[u][i]; return u; } struct node{ int x; bool operator<(const node&G)const{ return dep[x]<dep[G.x]; } }; priority_queue<node>Q; set<int>G; struct segtree{ int t[MAXN<<2]; void pushup(int pos){ t[pos]=min(t[lson],t[rson]); } void build(int pos,int l,int r){ if(l==r){ t[pos]=n+1; return; } int mid=(l+r)>>1; build(lson,l,mid),build(rson,mid+1,r); pushup(pos); } void update(int pos,int l,int r,int x,int y){ if(l==r){ t[pos]=y; return; } int mid=(l+r)>>1; if(x<=mid)update(lson,l,mid,x,y); if(x>mid)update(rson,mid+1,r,x,y); pushup(pos); } int query(int pos,int l,int r,int ql,int qr){ if(ql<=l&&qr>=r)return t[pos]; int mid=(l+r)>>1; if(qr<=mid)return query(lson,l,mid,ql,qr); if(ql>mid)return query(rson,mid+1,r,ql,qr); return min(query(lson,l,mid,ql,qr),query(rson,mid+1,r,ql,qr)); } }T; bool check(int x,int k){ return T.query(1,1,n,dfn[x],ed[x])<=dep[x]+k-1; } vector<int>TMP; void sol(int x){ as[x]=sum; for(auto o:I[x])G.insert(o); for(auto o:D[x])G.erase(o); for(auto o:G)Q.push({o}); while(!Q.empty()){ int u=Q.top().x;Q.pop(); if(check(u,x))continue; int tmp=qry(u,x); as[x]++;TMP.pb(u); TMP.pb(u),T.update(1,1,n,dfn[u],dep[u]); if(tmp)Q.push({tmp}); } for(auto o:TMP)T.update(1,1,n,dfn[o],n+1); } void slv(){ n=read(); for(int i=1;i<n;i++){ int u=read(),v=read(); add_side(u,v); } dep[1]=1;dfs(1,0); for(int i=1;i<=N;i++)for(int j=1;j<=n;j++)fa[j][i]=fa[fa[j][i-1]][i-1]; T.build(1,1,n); for(int i=1;i<=n;i++)if(d[i]==1)T.update(1,1,n,dfn[i],dep[i]),sum++; for(int i=1;i<=len;i++)sol(i); m=read(); while(m--){ int x=min(len,read()); printf("%lld\n",as[x]); } } signed main(){ // freopen("tree.in","r",stdin);freopen("tree.out","w",stdout); slv(); return 0; }