传送门

时隔一个月再次写点分治,比上一次要深入理解很多了。(虽然代码还是写不熟

模板题,不多说

//POJ 1741
//by Cydiater
//2016.9.22
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <ctime>
#include <cmath>
#include <cstdlib>
#include <iomanip>
#include <iostream>
using namespace std;
#define ll long long
#define up(i,j,n)        for(int i=j;i<=n;i++)
#define down(i,j,n)        for(int i=j;i>=n;i--)
const int MAXN=1e6+5;
const int oo=0x3f3f3f3f;
inline int read(){
    char ch=getchar();int x=0,f=1;
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int N,K,LINK[MAXN],len=0,root,siz[MAXN],sum,max_siz[MAXN],ans,dis[MAXN],head,tail,q[MAXN];
bool vis[MAXN];
struct edge{
    int y,next,v;
}e[MAXN];
namespace solution{
    inline void insert(int x,int y,int v){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;e[len].v=v;}
    void init(){
        if(N==0&&K==0)exit(0);
        len=ans=root=0;
        memset(LINK,0,sizeof(LINK));
        memset(vis,0,sizeof(vis));
        up(i,2,N){
            int x=read(),y=read(),v=read();
            insert(x,y,v);
            insert(y,x,v);
        }
    }
    void make_root(int node,int fa){
        siz[node]=1;max_siz[node]=0;
        for(int i=LINK[node];i;i=e[i].next)if(!vis[e[i].y]&&e[i].y!=fa){
            make_root(e[i].y,node);
            siz[node]+=siz[e[i].y];
            max_siz[node]=max(max_siz[node],siz[e[i].y]);
        }
        max_siz[node]=max(max_siz[node],sum-max_siz[node]);
        if(max_siz[node]<max_siz[root])root=node;
    }
    void get_deep(int node,int fa){
        q[++tail]=dis[node];
        for(int i=LINK[node];i;i=e[i].next)if(!vis[e[i].y]&&e[i].y!=fa){
            dis[e[i].y]=dis[node]+e[i].v;
            get_deep(e[i].y,node);
        }
    }
    int col(int node,int dist){
        int tmp=0;
        dis[node]=dist;head=1;tail=0;
        get_deep(node,0);
        sort(q+1,q+tail+1);
        while(head<tail){
            while(q[head]+q[tail]>K&&head<tail)tail--;
            tmp+=tail-head;
            head++;
        }
        return tmp;
    }
    void work(int node){
        ans+=col(node,0);vis[node]=1;
        for(int i=LINK[node];i;i=e[i].next)
            if(!vis[e[i].y]){
                ans-=col(e[i].y,e[i].v);
                sum=siz[e[i].y];root=0;
                make_root(e[i].y,node);
                work(root);
            }
    }
    void slove(){
        root=N;sum=0;max_siz[0]=oo;
        make_root(1,0);
        work(root);
    }
    void output(){
        printf("%d\n",ans);
    }
}
int main(){
    //freopen("input.in","r",stdin);
    using namespace solution;
    while(scanf("%d %d",&N,&K)!=EOF){
        init();
        slove();
        output();
    }
    return 0;
}

POJ1741:tree的更多相关文章

  1. POJ1741 Tree + BZOJ1468 Tree 【点分治】

    POJ1741 Tree + BZOJ1468 Tree Description Give a tree with n vertices,each edge has a length(positive ...

  2. POJ1741 Tree(树分治——点分治)题解

    题意:给一棵树,问你最多能找到几个组合(u,v),使得两点距离不超过k. 思路:点分治,复杂度O(nlogn*logn).看了半天还是有点模糊. 显然,所有满足要求的组合,连接这两个点,他们必然经过他 ...

  3. [poj1741][tree] (树/点分治)

    Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...

  4. POJ1741 tree 【点分治】

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 25286   Accepted: 8421 Description ...

  5. POJ1741 Tree(树的点分治基础题)

    Give a tree with n vertices,each edge has a length(positive integer less than 1001).Define dist(u,v) ...

  6. POJ1741 Tree (点分治)

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 25772   Accepted: 8566 Description ...

  7. POJ1741——Tree(树的点分治)

    1 /* *********************************************** 2 Author :kuangbin 3 Created Time :2013-11-17 1 ...

  8. POJ-1741 Tree (树上点分治)

    题目大意:一棵带边权无根树,边权代表距离,求距离小于等于k的点对儿数. 题目分析:这两个点之间的路径只有两种可能,要么经过根节点,要么在一棵子树内.定义depth(i)表示点 i 到根节点的距离,be ...

  9. poj1741 Tree(点分治)

    题目链接:http://poj.org/problem?id=1741 题意:求树上两点之间距离小于等于k的点对的数量 思路:点分治模板题,推荐一篇讲的非常好的博客:https://blog.csdn ...

随机推荐

  1. Windows 10 后台音频

    UWP版本的网易云音乐已经上架,虽然还不支持Windows Phone但是整体而言功能已经比较齐全了! 那么如何在Windows 10 UWP实现后台播放呢? 我之前是一直在做Windows Phon ...

  2. Python时间性能测量

    主要有以下三种方式: 一,CPU时间 time.clock() 测量CPU时间,比较精准,通过比较程序运行前后的CPU时间差,得出程序运行的CPU时间. 二, 时钟时间 time.time() 测量时 ...

  3. Linux C中结构体初始化

          在阅读GNU/Linux内核代码时,我们会遇到一种特殊的结构初始化方式.该方式是某些C教材(如谭二版.K&R二版)中没有介绍过的.这种方式称为指定初始化(designated in ...

  4. android之Activity回传数据

    约定:当Activity发生跳转时将原来的Activity成为父Activity,将新出现的Activity成为子Activity. 情景设置 下面是个发短信的Activity 当我们点击图中的+按钮 ...

  5. [转]java 输出流转输入流

    ByteArrayOutputStream.toByteArray ByteArrayInputStream StringWriter.toString StringReader 字符流和二进制流是j ...

  6. iOS 自定义NavigationBar右侧按钮rightBarButtonItem--button

    //两个按钮的父类view UIView *rightButtonView = [[UIView alloc] initWithFrame:CGRectMake(, , , )]; //历史浏览按钮 ...

  7. dig 常用的域名查询工具

    dig 命令是常用的域名查询工具,可以用来测试域名系统工作是否正常. 语法: dig (选项) (参数) 选项: @<服务器地址>: 指定进行域名解析的域名服务器: -b: 当主机具有多个 ...

  8. 0930MySQL中实现高性能高并发计数器方案(例如文章点击数)

    转自http://www.jb51.net/article/56656.htm 这篇文章主要介绍了MySQL中实现高性能高并发计数器方案,本文中的计数器是指如文章的点击数.喜欢数.浏览次数等,需要的朋 ...

  9. [转]oracle数据类型和对应的java类型

    地址: http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/java.102/B19275-03/datacc.htm ...

  10. [转]响应式WEB设计学习(3)—如何改善移动设备网页的性能

    原文地址:http://www.jb51.net/web/70362.html 前言 移动设备由于受到带宽.处理器运算速度的限制,因而对网页的性能有更高的要求.究竟是网页中的何种元素拉低了网页在移动设 ...