#include<bits/stdc++.h>
#define inf 1000000000
#define ll long long
#define N 200005
using namespace std;
ll ans,n,z,d[N],p[N],q[N],mn[N],mx[N],f[N];
int main() {
cin>>n;
for(int i=1,u,v;i<n;i++)cin>>u>>v,d[u]++,d[v]++;
for(int i=1;i<=n;i++)d[i]--,p[d[i]]++,mn[i]=inf,mx[i]=-inf,(!d[i]?z++:z=z);
mn[0]=mx[0]=0;
for(int i=1;i<=n;i++){
int x=p[i];
if(!x)continue;
for(int j=0;j<=n;j++)f[j]=mx[j];
for(int j=0;j<i;j++){
int hd=1,tl=0;
for(int k=j;k<=n;k+=i){
while (hd<=tl && q[hd]<k-i*x) hd++;
if (hd<=tl) mx[k]=max(mx[k],f[q[hd]]+k/i-q[hd]/i);
while (hd<=tl && f[q[tl]]-q[tl]/i<=f[k]-k/i) tl--;
q[++tl]=k;
}
}
}
for (int i=1;i<=n;i++) {
int x=p[i];
if (!x) continue;
for (int j=0;j<=n;j++) f[j]=mn[j];
for (int j=0;j<i;j++) {
int hd=1,tl=0;
for (int k=j;k<=n;k+=i) {
while (hd<=tl && q[hd]<k-i*x) hd++;
if(hd<=tl) mn[k]=min(mn[k],f[q[hd]]+k/i-q[hd]/i);
while(hd<=tl && f[q[tl]]-q[tl]/i>=f[k]-k/i) tl--;
q[++tl]=k;
}
}
}
for(int i=0;i<=n;i++)if(mn[i]<=mx[i])ans+=mx[i]-mn[i]+1+z;
cout<<ans;
}
[ARC125F] Tree Degree Subset Sum
最新推荐文章于 2024-11-05 21:58:11 发布