[CF2167F] Tree, TREE!!! 题解
aeiouaoeiu · · 题解
先考虑
考察
- 若
r 在u 的儿子v 的子树内,则\text{siz}'_u=n-\text{siz}_v ,一共有\text{siz}_v 个这样的r ; - 若
r 在u 的子树外,则\text{siz}'_u=\text{siz}_u ,一共有n-\text{siz}_u 个这样的r ; - 若
r=u ,则\text{siz}'_u=n 。
于是可以轻松求出
时间复杂度线性。
::::info[code]
#include<bits/stdc++.h>
#define pb emplace_back
#define mp make_pair
#define pob pop_back
using namespace std;
typedef long long ll;
const ll maxn=200007,ee=1e18;
ll n,k,siz[maxn],ans;
vector<ll> edge[maxn];
void dfs(ll u,ll fa){
siz[u]=1;
for(auto v:edge[u]){
if(v==fa) continue;
dfs(v,u),siz[u]+=siz[v];
ans+=siz[v]*(n-siz[v]>=k);
}
ans+=(n-siz[u])*(siz[u]>=k);
}
int main(void){
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0);
ll T=1; cin>>T;
for(;T--;){
for(ll i=1;i<=n;i++) edge[i].clear();
cin>>n>>k,ans=n;
for(ll i=1,u,v;i<n;i++){
cin>>u>>v;
edge[u].pb(v),edge[v].pb(u);
}
dfs(1,0);
cout<<ans<<"\n";
}
return 0;
}
::::