Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
35857 | liuyile | 【S】T4 | C++ | 通过 | 100 | 593 MS | 25272 KB | 2486 | 2025-01-05 20:19:57 |
#include <bits/stdc++.h> using namespace std; #define endl "\n" // #define int long long int n; int d[100300]; vector<int>S[100300],g[100300]; int fa[100300][21],dep[100300],siz[100300]; int dfn[100300],tk; inline void dfs(int u){ dep[u]=dep[fa[u][0]]+1; siz[u]=1; d[u]=n+1; dfn[u]=++tk; for(int i=1;i<=20;i++) fa[u][i]=fa[fa[u][i-1]][i-1]; for(int v:g[u])if(v!=fa[u][0]){ fa[v][0]=u; dfs(v); siz[u]+=siz[v]; d[u]=min(d[u],d[v]+1); } if(d[u]==n+1)d[u]=0; S[d[u]].push_back(u); } inline int kA(int x,int k){ for(int i=0;i<=20;i++)if((k>>i)&1)x=fa[x][i]; return x; } int w[100300<<2]; #define lc(x) (x<<1) #define rc(x) (x<<1|1) inline void upd(int x){ w[x]=min(w[lc(x)],w[rc(x)]); } inline void mod(int x,int l,int r,int c,int k){ if(l==r){ w[x]=k; return ; } int mid=l+r>>1; if(c<=mid)mod(lc(x),l,mid,c,k); else mod(rc(x),mid+1,r,c,k); upd(x); } inline int gt(int x,int l,int r,int L,int R){ if(L<=l&&r<=R)return w[x]; int mid=l+r>>1; int res=1e9; if(L<=mid)res=min(res,gt(lc(x),l,mid,L,R)); if(R>mid)res=min(res,gt(rc(x),mid+1,r,L,R)); return res; } int lcnt=0; inline void ins(int u){ lcnt++; mod(1,1,n,dfn[u],dep[u]); } inline void del(int u){ lcnt--; mod(1,1,n,dfn[u],1e9); } inline int calc(int k){ priority_queue<pair<int,int>>q; for(int x:S[k]) q.push({dep[x],x}); vector<int>T; while(!q.empty()){ int u=q.top().second; q.pop(); if(gt(1,1,n,dfn[u],dfn[u]+siz[u]-1)-dep[u]<k)continue; else{ T.push_back(u); ins(u); int v=kA(u,k); if(v!=0)q.push({dep[v],v}); } } int res=lcnt; for(int x:T) del(x); return res; } int ANS[100300]; signed main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); // freopen("SS.in","r",stdin); // freopen("SS.out","w",stdout); cin>>n; memset(w,0x3f,sizeof(w)); for(int i=1;i<n;i++){ int u,v; cin>>u>>v; g[u].push_back(v); g[v].push_back(u); } dfs(1); for(int x:S[0]) ins(x); for(int i=1;i<=n;i++) ANS[i]=calc(i); // return 0; int q; cin>>q; while(q--){ int k; cin>>k; cout<<ANS[min(n,k)]<<endl; } return 0; }