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

这是一道板子题

#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;elseans=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;elser=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;
}

转载于:https://www.cnblogs.com/dreagonm/p/10092606.html

CF161D Distance in Tree(点分治)相关推荐

  1. 【CodeForces】914 E. Palindromes in a Tree 点分治

    [题目]E. Palindromes in a Tree [题意]给定一棵树,每个点都有一个a~t的字符,一条路径回文定义为路径上的字符存在一个排列构成回文串,求经过每个点的回文路径数.n<=2 ...

  2. HDU 4812 D Tree (点分治) (2013ACM/ICPC亚洲区南京站现场赛)

    HDU 4812 D Tree 思路 点对距离相等并且要求输出字典序最小的点对,距离相等不就是点分治裸题了嘛, 照着这个思路出发我们只要记录下所有点对是满足要求的,然后再去找字典序最小的点对就行了, ...

  3. Codeforces Round #507 (Div. 1) D. You Are Given a Tree 根号分治 + dp

    传送门 题意: 有一颗nnn个节点的树,其中一个简单路径集合被称为kkk合法当且仅当: 树的每个节点至多属于一条路径,且每条路径恰好包含kkk个点. 对于k∈[1,n]k\in [1,n]k∈[1,n ...

  4. P4178 Tree (点分治)

    题意: 给定一棵 n 个节点的树,每条边有边权,求出树上两点距离小于等于 k 的点对数量. 题解: 根点分治模板提很相似,只不过这个题目让你去维护小于等于k距离点的个数,这个时候我们还是要用到桶的思想 ...

  5. 点分治问题 ----------- HDU4812 D Tree [点分治 + 乘法逆元]

    题目链接 题目大意: 给你一颗树,树上节点有个权值aia_iai​,现在问你这颗树上是否存在一条路径这个路径上面权值的乘积模1e6+3等于k. 如果有多组答案输出字典序最小的答案 解题思路: 1.首先 ...

  6. bzoj 2870 最长道路tree——边分治

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2870 关于边分治:https://www.cnblogs.com/Khada-Jhin/p/ ...

  7. bzoj 1468 Tree(点分治模板)

    1468: Tree Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1527  Solved: 818 [Submit][Status][Discus ...

  8. HDU D Tree [点分治]

    传送门 题意:找路径积$\mod 1e6+3 = k$的字典序最小点对 作为一个点分治蒟蒻,写这道题花了两节课.... 显然只要开一个桶$c[i]$记录当前路径积为$i$的最小点 然后处理一个子树时一 ...

  9. POJ - 1741 Tree(点分治模板题)

    题目链接:点击查看 题目大意:给出一棵 n 个节点的树,现在定义 dis( x , y ) 为点 x 和点 y 之间的路径长度,现在问 dis ( x , y ) <= k 的点对有多少 题目分 ...

  10. poj1741 Tree 点分治

    入门题,算是对树分治有了初步的理解吧. #include<iostream> #include<cstdio> #include<cstring> #include ...

最新文章

  1. 2021年大数据Spark(二十六):SparkSQL数据处理分析
  2. 马云:我不懂技术但欣赏技术 达摩院必须超越微软 - 20171011
  3. 蓝桥杯2016年C/C++ 混搭
  4. 删数问题 详解(C++)
  5. Python衍射初步
  6. TypeScript-键盘映射
  7. sns.relplot
  8. 【算法分析】回溯法解数独(九宫格)算法
  9. 二、互联网思维之用户思维
  10. 经典的期货量化交易策略大全(含源代码)
  11. 有梦想,就去追,不犹豫,不后悔
  12. 保障出行安全|科力锐助力长沙黄花国际机场灾备建设
  13. 程序员必备的20多种开发工具
  14. 清华“天机芯”团队再发重磅研究!以全新类脑计算系统实现通用人工智能
  15. C语言 一个球从100米高度下落,每次下落反弹原来高度的一半,如此反复,求第10次落地时共经历了多少米?第10次反弹多高?
  16. 考虑风光火储的微电网优化调度 考虑风电、光伏、热电机组和储能优化调度,其中负荷考虑冬季或夏季两种场景,并且考虑晴天、多云、雨天、多风和少风场景
  17. 导数用于判断函数的单调性,凹凸性,极值
  18. java开发微信如何维护登录状态_5.13微信登录维护态与获取用户信息思想
  19. siamfc-pytorch代码分析
  20. 基于工业级4G5G路由器大型设备远程无线监控方案

热门文章

  1. 长沙理工大学第十二届ACM大赛L 选择困难症 (剪枝暴搜)
  2. python学习笔记 day44 表与表之间的关系
  3. js保留n位小数——toFiexed()
  4. Jzoj5231 序列问题
  5. 怎么方便地不通过鼠标在应用之间复制/粘贴文本
  6. OpenWebFlow0.9用户手册与设计说明
  7. 用PBKDF2 或BCrypt 来存储密码
  8. lucene3.5学习笔记03--待续
  9. [原创]Tsys 2.0 beta 官方版无法使用自定义SQ
  10. 表关系+表的详细操作+字段详细操作+特殊表--day40