传送门

又一道点分治。

直接维护子树内到根的所有路径长度,然后排序+双指针统计答案。

代码如下:

#include<bits/stdc++.h>
#define N 40005
using namespace std;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
int rt,sum,ans,n,k,tot=0,cnt=0,msiz[N],siz[N],d[N],first[N];
bool vis[N];
struct Node{int v,next,w;}e[N<<1];
inline void add(int u,int v,int w){e[++tot].v=v,e[tot].w=w,e[tot].next=first[u],first[u]=tot;}
inline void getroot(int p,int fa){
    siz[p]=1,msiz[p]=0;
    for(int i=first[p];i;i=e[i].next){
        int v=e[i].v;
        if(v==fa||vis[v])continue;
        getroot(v,p),siz[p]+=siz[v];
        if(msiz[p]<siz[v])msiz[p]=siz[v];
    }
    if(sum-siz[p]>msiz[p])msiz[p]=sum-siz[p];
    if(msiz[p]<msiz[rt])rt=p;
}
inline void getdis(int p,int fa,int dis){
    d[++cnt]=dis;
    for(int i=first[p];i;i=e[i].next){
        int v=e[i].v;
        if(vis[v]||v==fa)continue;
        getdis(v,p,dis+e[i].w);
    }
}
inline int calc(int p,int v){
    int ret=0;
    cnt=0;
    getdis(p,0,v);
    sort(d+1,d+cnt+1);
    int l=1,r=cnt;
    while(l<r){
        while(d[l]+d[r]>k&&r>l)--r;
        if(d[l]+d[r]<=k)ret+=r-l;
        ++l;
    }
    return ret;
}
inline void solve(int p){
    ans+=calc(p,0);
    vis[p]=true;
    for(int i=first[p];i;i=e[i].next){
        int v=e[i].v;
        if(vis[v])continue;
        ans-=calc(v,e[i].w);
        sum=siz[v],rt=0,getroot(v,0);
        solve(rt);
    }
}
int main(){
    n=read();
    for(int i=1;i<n;++i){
        int u=read(),v=read(),w=read();
        add(u,v,w),add(v,u,w);
    }
    k=read();
    msiz[rt=0]=sum=n,getroot(1,0),solve(rt);
    printf("%d",ans);
    return 0;
}

2018.07.20 洛谷P4178 Tree(点分治)的更多相关文章

  1. 洛谷P4178 Tree (点分治)

    题目描述 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K 输入输出格式 输入格式:   N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下 ...

  2. 洛谷 P4178 Tree —— 点分治

    题目:https://www.luogu.org/problemnew/show/P4178 这道题要把 dep( dis? ) 加入一个 tmp 数组里,排序,计算点对,复杂度很美: 没有写 sor ...

  3. [洛谷P4178] Tree (点分治模板)

    题目略了吧,就是一棵树上有多少个点对之间的距离 \(\leq k\) \(n \leq 40000\) 算法 首先有一个 \(O(n^2)\) 的做法,枚举每一个点为起点,\(dfs\) 一遍可知其它 ...

  4. POJ1471 Tree/洛谷P4178 Tree

    Tree P4178 Tree 点分治板子. 点分治就是直接找树的重心进行暴力计算,每次树的深度不会超过子树深度的\(\frac{1}{2}\),计算完就消除影响,找下一个重心. 所以伪代码: voi ...

  5. 2018.07.01洛谷P2617 Dynamic Rankings(带修主席树)

    P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i ...

  6. 点分治模板(洛谷P4178 Tree)(树分治,树的重心,容斥原理)

    推荐YCB的总结 推荐你谷ysn等巨佬的详细题解 大致流程-- dfs求出当前树的重心 对当前树内经过重心的路径统计答案(一条路径由两条由重心到其它点的子路径合并而成) 容斥减去不合法情况(两条子路径 ...

  7. 2018.07.17 洛谷P1368 工艺(最小表示法)

    传送门 好的一道最小表示法的裸板,感觉跑起来贼快(写博客时评测速度洛谷第二),这里简单讲讲最小表示法的实现. 首先我们将数组复制一遍接到原数组队尾,然后维护左右指针分别表示两个即将进行比较的字符串的头 ...

  8. 2018.07.22 洛谷P3047附近的牛(树形dp)

    传送门 给出一棵n" role="presentation" style="position: relative;">nn个点的树,每个点上有C ...

  9. 2018.07.22 洛谷P1967 货车运输(kruskal重构树)

    传送门 这道题以前只会树剖和最小生成树+倍增. 而现在学习了一个叫做kruskal" role="presentation" style="position: ...

随机推荐

  1. AS3获取对象类名,getDefinitionByName,getQualifiedClassName,getQualifiedSuperclassName

    首先先告诉大家,我要讲的是flash.utils包中的getDefinitionByName,getQualifiedClassName,getQualifiedSuperclassName可能帮助文 ...

  2. span width不起作用,border 无效

    span属于内联元素,因此width对内联元素不起作用. 需要设置display:inline-block;使其成为内联级块级元素: border不起作用,主要是未设置border-style:sol ...

  3. ABAP-索引

    转载:http://blog.sina.com.cn/s/blog_498610450101kbxl.html tables: csks. start-of-selection. select * u ...

  4. ABAP-动态程序生成

    科技越来越进步,人也就变的越来越懒,最终的演变就是大脑发达,四肢退化...AI的到来,准备接招吧... 报表若没有过多的用户交互逻辑,一般可通过SQ01配置生成,本文介绍用ABAP方式实现报表程序的动 ...

  5. JAVA学习(七)__Spring的@Autowired注入规则

    @Autowired 默认是按照byType进行注入的,但是当byType方式找到了多个符合的bean,又是怎么处理的? 经过一些代码的测试,我发现,Autowired默认先按byType,如果发现找 ...

  6. TEXT 6 Travelling with baggage

    TEXT 6 Travelling with baggage 背着行囊去旅行 Feb 16th 2006 From The Economist print edition (1)FEW modern ...

  7. Nunit常用的方法说明

    下来还是分为2个部分,一是NUnit的布局,另外一部分就是它的核心概念. 首先熟悉一下NUnit GUI的布局. 让我们更进一步看一下测试运行器窗口的布局.在右边面板的中间,可以看到测试进度条.进度条 ...

  8. Spark数据类型SparseMatrix 解释

    http://blog.csdn.net/sinat_29508201/article/details/54089771 parseMatrix Spark的mllib包中提供了机器学习的两种基本数据 ...

  9. 第八章 高级搜索树 (xa3)红黑树:插入

  10. dfs小练 【dfs】

    1.前n个自然数的所有排列: #include <iostream> #include <cstdio> #include <cstring> using name ...