传送门

只是来贴一个点分治的板子(年轻时候写的丑别介意)。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 10010
#define INF 1e9+10
struct node{int v,c,next;}e[N*2];
int first[N],m;
int son[N],f[N];
bool in[N];
int d[N],dep[N];
int n,sum,root,k,ans;
inline void add(int u,int v,int cost){//邻接表存储边
    e[++m].next=first[u];
    first[u]=m;
    e[m].v=v;
    e[m].c=cost;
}
void getroot(int v,int fa){//找出当前树的重心
    son[v]=1;
    f[v]=0;
    for(int i=first[v];i;i=e[i].next)
        if(e[i].v!=fa&&!in[e[i].v]){
            getroot(e[i].v,v);
            son[v]+=son[e[i].v];
            f[v]=max(f[v],son[e[i].v]);
        }
    f[v]=max(f[v],sum-son[v]);
    if(f[v]<f[root])root=v;//更新根节点
}
void getdeep(int v,int fa){//预处理到当前根节点的距离
    dep[++dep[0]]=d[v];
    for(int i=first[v];i;i=e[i].next)
        if(e[i].v!=fa&&!in[e[i].v]){
            d[e[i].v]=d[v]+e[i].c;
            getdeep(e[i].v,v);
        }
}
int cal(int v,int cost){//用双指针法求出当前子树信息
    d[v]=cost;
    dep[0]=0;
    getdeep(v,0);
    sort(dep+1,dep+dep[0]+1);
    int l=1,r=dep[0],sum=0;
    while(l<r){//双指针
        if(dep[l]+dep[r]<=k){
            sum+=r-l;
            ++l;
        }
        else --r;
    }
    return sum;
}
void solve(int v){//求出子问题答案
    ans+=cal(v,0);
    in[v]=1;
    for(int i=first[v];i;i=e[i].next)
        if(!in[e[i].v]){
            ans-=cal(e[i].v,e[i].c);//去重
            sum=son[e[i].v];
            root=0;
            getroot(e[i].v,0);
            solve(root);
        }
}
int main(){
    int u,v,w;
    while(scanf("%d%d",&n,&k)&&n&&k){
        ans=root=m=0;
        memset(in,0,sizeof(in));
        memset(first,0,sizeof(first));
        for(int i=1;i<n;++i){
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);
            add(v,u,w);
        }
        f[0]=INF;//赋极大初值来找重心
        sum=n;
        getroot(1,0);//找重心
        solve(root);//点分治求解
        printf("%d\n",ans);
    }
    return 0;
}

2018.07.31 POJ1741Tree(点分治)的更多相关文章

  1. 2018.07.31洛谷P1552 [APIO2012]派遣(可并堆)

    传送门 貌似是个可并堆的模板题,笔者懒得写左偏堆了,直接随机堆水过.实际上这题就是维护一个可合并的大根堆一直从叶子合并到根,如果堆中所有数的和超过了上限就一直弹直到所有数的和不超过上限为止,最后对于当 ...

  2. 2018.07.31 bzoj4569: [Scoi2016]萌萌哒(并查集+倍增)

    传送门 对于每个限制,使用倍增的二进制拆分思想,用并查集数组fa[i][j]" role="presentation" style="position: rel ...

  3. http://www.cnblogs.com/ycxyyzw/archive/2012/07/31/2616951.html

    http://www.cnblogs.com/ycxyyzw/archive/2012/07/31/2616951.html

  4. China Cloud Computing Conference(2018.07.24)

    时间:2018.07.24地点:北京国家会议中心

  5. AI Summit(2018.07.19)

    AI Summit 时间:2018.07.19地点:北京丽都皇冠假日酒店

  6. China Internet Conference(2018.07.12)

    中国互联网大会 时间:2018.07.12地点:北京国家会议中心

  7. <2013 07 31> 没有必然的理由

    <2013 07 31> 没有必然的理由 没有必然的理由 人类从野蛮走向文明 也可能,从野蛮走向更野蛮 没有必然的理由 人群从疯狂走向理智 也可能,从疯狂走向更疯狂 没有必然的理由 你我从 ...

  8. agentzh 的 Nginx 教程(版本 2019.07.31)

    agentzh 的 Nginx 教程(版本 2019.07.31) agentzh 的 Nginx 教程(版本 2019.07.31) https://openresty.org/download/a ...

  9. 2018.07.20 洛谷P4178 Tree(点分治)

    传送门 又一道点分治. 直接维护子树内到根的所有路径长度,然后排序+双指针统计答案. 代码如下: #include<bits/stdc++.h> #define N 40005 using ...

随机推荐

  1. PHP依赖注入

    对于依赖注入 我现在的理解是把一个方法当成一个变量放进另一个方法的形参里 <?php class Factory { public static function getDb(){ return ...

  2. 加密算法之AES算法(转)

    转载http://www.mamicode.com/info-detail-514466.html 0 AES简介 美国国家标准技术研究所在2001年发布了高级加密标准(AES).AES是一个对称分组 ...

  3. Tomcat 异常关闭排查

    N次请求 tomcat conf/server.xml https://blog.csdn.net/qq_30121245/article/details/52861935 pattern分析 %a ...

  4. Nginx bind() to 0.0.0.0:8000 failed (10013: 错误解决

    本人配置Nginx 8000端口, 启动Nginx 失败, 查看日志logs/error.log出现如下提示 结束酷狗进程就Ok叻

  5. python 3 属性查找与绑定方法

    1.属性查找 类有两种属性:数据属性和函数属性 (1)类的数据属性是所有对象共享的 #类的数据属性是所有对象共享的,id都一样 class OldboyStudent: school='oldboy' ...

  6. 使用sqldeveloper连接服务器端数据库

  7. this指针的调整

    我们先来看一段代码: #include <iostream> using namespace std; class A { public: int a; A( ) { printf(&qu ...

  8. Python 字符串操作,截取,长度

    1.字符串操作: 字符串长度: s = "; slen = len(s); 字符串截取: print s[:-:-] #截取,逆序隔1个取一个字符 print s[:-:-] #截取,逆序隔 ...

  9. 执行js,通过js显示隐藏的输入框,或者给input赋值

    在测试过程中,有些输入框是隐藏的,如果直接对他进行赋值,会找不到这个输入框,从而导致脚本运行失败. 例如下面的这个密码输入框: 登录密码输入框分为两个input,下面的是提示的,上面的才是真正存下来的 ...

  10. 无法打开登录所请求的数据库 "****"。登录失败

    错误:无法打开登录所请求的数据库 "****".登录失败.用户 '****' 登录失败. sql2005连接时出现的错误 解决方法:权限不够,给登录名授权,赋予管理员角色,在登录名 ...