点分治是一种处理树的优秀暴力

这是一道板子题

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int u[50010<<1],v[50010<<1],fir[50010],nxt[50010<<1],cnt,root,sz[50010],f[50010],middis[50010],midcnt,n,k,vis[50010],Siz;
long long ans=0;
void addedge(int ui,int vi){
++cnt;
u[cnt]=ui;
v[cnt]=vi;
nxt[cnt]=fir[ui];
fir[ui]=cnt;
}
void getroot(int u,int fa){
sz[u]=1,f[u]=1;
for(int i=fir[u];i;i=nxt[i]){
if(v[i]==fa||vis[v[i]])
continue;
getroot(v[i],u);
sz[u]+=sz[v[i]];
f[u]=max(f[u],sz[v[i]]);
}
f[u]=max(Siz-sz[u],f[u]);
if(f[u]<f[root])
root=u;
}
void getdis(int u,int d,int fa){
// printf("ux=%d\n",u);
middis[++midcnt]=d;
for(int i=fir[u];i;i=nxt[i]){
if(vis[v[i]]||v[i]==fa)
continue;
getdis(v[i],d+1,u);
}
}
int look1(int l,int k){
int ans=0,r=midcnt;
while(l<=r){
int mid=(l+r)>>1;
if(middis[mid]<k)
l=mid+1;
else
ans=mid,r=mid-1;
}
return ans;
}
int look2(int l,int k){
int ans=0,r=midcnt;
while(l<=r){
int mid=(l+r)>>1;
if(middis[mid]<=k)
l=mid+1,ans=mid;
else
r=mid-1;
}
return ans;
}
int solve(void){
sort(middis+1,middis+midcnt+1);
// for(int i=1;i<=midcnt;i++)
// printf("%d ",middis[i]);
// getchar();
// printf("\n");
int mid=0;
int l=1;
while(l<midcnt&&middis[l]+middis[midcnt]<k)
++l;
while(l<midcnt&&k-middis[l]>=middis[l]){
int l2=look2(l+1,k-middis[l]),l1=look1(l+1,k-middis[l]);
if(l2>=l1)
mid+=l2-l1+1;
l++;
}
return mid;
}
void divide(int u){
// printf("u=%d\n",u);
// getchar();
vis[u]=true;
midcnt=0;
getdis(u,0,0);
// printf("ok\n");
ans+=solve();
// printf("an=%d\n",ans);
for(int i=fir[u];i;i=nxt[i]){
if(vis[v[i]])
continue;
midcnt=0;
getdis(v[i],1,0);
ans-=solve();
// printf("s=%d\n",ans);
root=0;
Siz=sz[v[i]];
getroot(v[i],u);
divide(root);
}
}
int main(){
scanf("%d %d",&n,&k);
for(int i=1;i<=n-1;i++){
int a,b;
scanf("%d %d",&a,&b);
addedge(a,b);
addedge(b,a);
}
Siz=n;
f[0]=0x3f3f3f3f;
getroot(1,0);
divide(root);
printf("%lld",ans);
return 0;
}

最新文章

  1. Redis高可用分布式内部交流(九)
  2. SQL Server 表变量和临时表的区别
  3. Git CMD - reset: Reset current HEAD to the specified state
  4. android studio 使用的一些注意,一些报错的解决方法(原创)
  5. flash播放器遮挡页面中元素问题解决
  6. WPF4多点触摸事件
  7. 基于visual Studio2013解决面试题之0603调整数组
  8. Postman 官网教程,重点内容,翻译笔记,
  9. C 函数参数 char **s与char *s[]
  10. JAVA学习笔记(3)—— 抽象类与接口
  11. hbase的api操作之scan
  12. 利用gitbush从git上下载代码到本地
  13. GDB常用调试命令以及多进程多线程调试
  14. pm2-zabbix 安装与配置
  15. Python3基础 逻辑运算 and or not 示例
  16. 小程序Openid 获取,服务器 encryptedData 解密 遇到的坑
  17. Linux CGI编程基础【整理】
  18. 【Linux】GCC编译器
  19. bzoj2705Longge的问题
  20. C# 饼形图

热门文章

  1. sitecore系列教程之更改您的个人设置
  2. Python 5 -- 模块
  3. [博客迁移]探索Windows Azure 监控和自动伸缩系列3 - 启用Azure监控扩展收集自定义监控数据
  4. sql 表中删除字段重复的行
  5. linux基础命令---显示进程ps
  6. js中利用cookie实现记住密码功能
  7. UVA 11488 Hyper Prefix Sets (字典树)
  8. ssh无秘钥登录
  9. Java动态菜单添加
  10. linux+nginx+mysql+php环境下,安装ecshop