Description

一棵树,统计距离不大于 \(k\) 的点对个数.

Sol

点分治.

发现自己快把点分治忘干净了...

找重心使所有儿子的最大值尽量小,然后每次处理全部子树,再减去每个子树的贡献,这样就得到子树间的贡献了,然后再搞子树就可以,这就是一个子问题了.

Code

  1. /**************************************************************
  2. Problem: 3365
  3. User: BeiYu
  4. Language: C++
  5. Result: Accepted
  6. Time:352 ms
  7. Memory:6128 kb
  8. ****************************************************************/
  9.  
  10. #include<cstdio>
  11. #include<utility>
  12. #include<vector>
  13. #include<queue>
  14. #include<algorithm>
  15. #include<iostream>
  16. using namespace std;
  17.  
  18. typedef pair< int,int > pr;
  19. #define mpr make_pair
  20. #define debug(a) cout<<#a<<"="<<a<<" "
  21. const int N = 40005;
  22.  
  23. int n,m,k,rt,sz,ans;
  24. vector<pr> g[N];
  25. int s[N],f[N],b[N];
  26. vector<int> d;
  27. int q[N],h,t;
  28.  
  29. inline int in(int x=0,char ch=getchar()){ while(ch>'9' || ch<'0') ch=getchar();
  30. while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x; }
  31. void GetRoot(int u,int fa){
  32. s[u]=1,f[u]=0;
  33. for(int i=0,v;i<g[u].size();i++) if((v=g[u][i].first)!=fa && !b[v]){
  34. GetRoot(v,u),s[u]+=s[v],f[u]=max(f[u],s[v]);
  35. }f[u]=max(f[u],sz-s[u]);if(f[u]<f[rt]) rt=u;
  36. }
  37. void GetDeep(int u,int fa,int dep){
  38. d.push_back(dep),s[u]=1;
  39. for(int i=0,v;i<g[u].size();i++) if((v=g[u][i].first)!=fa && !b[v])
  40. GetDeep(v,u,dep+g[u][i].second),s[u]+=s[v];
  41. }
  42. int Calc(int u,int w){
  43. d.clear(),GetDeep(u,u,w);
  44. sort(d.begin(),d.end());
  45. int res=0;
  46. for(int l=0,r=d.size()-1;l<r;) if(d[l]+d[r]<=k) res+=r-l,l++;else r--;
  47. return res;
  48. }
  49. void GetAns(int u){
  50. ans+=Calc(u,0);b[u]=1;
  51. for(int i=0,v;i<g[u].size();i++) if(!b[v=g[u][i].first])
  52. ans-=Calc(v,g[u][i].second),f[0]=sz=s[v],GetRoot(v,rt=0),GetAns(rt);
  53. }
  54. int main(){
  55. // freopen("in.in","r",stdin);
  56. n=in(),m=in();
  57. for(int i=1,u,v,w;i<=m;i++) u=in(),v=in(),w=in(),g[u].push_back(mpr(v,w)),g[v].push_back(mpr(u,w));
  58. k=in();
  59. f[rt=0]=sz=n;
  60. GetRoot(1,0);
  61. GetAns(rt);
  62. cout<<ans<<endl;
  63. return 0;
  64. }

  

BZOJ 3365: [Usaco2004 Feb]Distance Statistics 路程统计的更多相关文章

  1. bzoj 3365 [Usaco2004 Feb]Distance Statistics 路程统计(点分治,单调)

    [题意] 求树上长度不超过k的点对数目. [思路] 和 Tree 一样一样的. 就是最后统计的时候别忘把根加上. [代码] #include<set> #include<cmath& ...

  2. 【刷题】BZOJ 3365 [Usaco2004 Feb]Distance Statistics 路程统计

    Description 在得知了自己农场的完整地图后(地图形式如前三题所述),约翰又有了新的问题.他提供 一个整数K(1≤K≤109),希望你输出有多少对农场之间的距离是不超过K的. Input 第1 ...

  3. bzoj 3365: [Usaco2004 Feb]Distance Statistics 路程统计【容斥原理+点分治】

    统计在一个root下的两个子树,每个子树都和前面的运算一下再加进去对于这种需要排序的运算很麻烦,所以考虑先不去同子树内点对的算出合法点对个数,然后减去每一棵子树内的合法点对(它们实际上是不合法的,相当 ...

  4. BZOJ_3365_[Usaco2004 Feb]Distance Statistics 路程统计&&POJ_1741_Tree_点分治

    BZOJ_3365_[Usaco2004 Feb]Distance Statistics 路程统计&&POJ_1741_Tree_点分治 Description     在得知了自己农 ...

  5. BZOJ1468: Tree & BZOJ3365: [Usaco2004 Feb]Distance Statistics 路程统计

    [传送门:BZOJ1468&BZOJ3365] 简要题意: 给出一棵n个点的树,和每条边的边权,求出有多少个点对的距离<=k 题解: 点分治模板题 点分治的主要步骤: 1.首先选取一个点 ...

  6. BZOJ 3364: [Usaco2004 Feb]Distance Queries 距离咨询

    Description 一棵树,询问两点间距离. Sol 倍增. 方向没用. 没有然后了. Code /************************************************ ...

  7. BZOJ 3367: [Usaco2004 Feb]The Big Game 球赛( dp )

    dp(i)表示前i个人最少坐多少辆车, dp(i) = min(dp(j) + 1, dp(i)) (0 <= j < i 且 (i, j]的人能坐在一辆车上) 时间复杂度O(n²) -- ...

  8. BZOJ 3363: [Usaco2004 Feb]Cow Marathon 奶牛马拉松

    Description 给你一个图,两个点至多有一条路径,求最长的一条路径. \(n \leqslant 4\times 10^4\) Sol DFS?DP? 这就是一棵树,方向什么的都没用... 然 ...

  9. BZOJ 3362: [Usaco2004 Feb]Navigation Nightmare 导航噩梦

    Description 给你每个点与相邻点的距离和方向,求两点间的曼哈顿距离. \(n \leqslant 4\times 10^4\) . Sol 加权并查集. 像向量合成一样合并就可以了,找 \( ...

随机推荐

  1. (转)Java字符串

    转自:http://blog.sina.com.cn/s/blog_899678b90101brz0.html 创建字符串有两种方式:两种内存区域(字符串池,堆)1," " 引号创 ...

  2. UVa 11988 Broken Keyboard(链表->数组实现)

    /*数组形式描述链表:链表不一定要用指针. 题目链接:UVa 11988 Broken Keyboard 题目大意: 小明没有开屏幕输入一个字符串,电脑键盘出现了问题会不定时的录入 home end ...

  3. C#--几个数据流Stream;StreamReader;StreamWriter;MemoryStream;BufferStream;

    命名空间:System.IO; Stream: 各种流的基类,不能时行查找操作,Position属性不能修改.读取时不Position不会自动移动, HttpWebRequest webreq = ( ...

  4. VC----Class Style类风格和窗口风格

    CS_BYTEALIGNCLIENT:以字节边界来对齐窗口客户区,这个风格会影响 窗口 的宽度和水平位置.实际上没有看到效果. CS_BYTEALIGNWINDOW:以字节边界来对齐窗口,这个风格会影 ...

  5. Robot Framework--01 创建简单工程示例

    1.新建Project: 填写name,选择Type为Dirctory,路径根据自己需要选择,建议最好不要在中文路径下,以免发生问题:

  6. 使用EntityFramework6.1的DbCommandInterceptor拦截生成的SQL语句

    开始 EF6.1也出来不少日子了,6.1相比6.0有个很大的特点就是新增了System.Data.Entity.Infrastructure.Interception 命名空间,此命名空间下的对象可以 ...

  7. 不下载SDK启动Android Studio

    一.不下载SDK启动Android Studio 给一个解决方法:Android Studio安装目录下的bin,idea.properties:idea.properties文件末尾加一行:disa ...

  8. URL中“#” “?” &“”号的作用

    URL中"#" "?" &""号的作用   阅读目录 1. # 2. ? 3. & 回到顶部 1. # 10年9月,twit ...

  9. [Unity] Unity3D研究院编辑器之自定义默认资源的Inspector面板

    比如编辑模式下对场景或者特定文件夹有一些操作可以在这个面板里来完成.. 代码如下. using UnityEngine; using System.Collections; using UnityEd ...

  10. ASP.NET MVC 表单提交List到Controller

    1.实体结构: 2.View代码: 3.controller代码: 参考链接:http://shiyousan.com/post/635383025861004585