POJ 1741 Tree (树分治)

【poj 1741】Tree 【树分治 点分治入门题】 Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 18550   Accepted: 6069 Description Give a tree with n vertices,each edge has a length(positive integer l 阅读详情

题意:

一颗有边权的树,问有多少对点距离和小于k

思路:

树分治
我们取一颗树的重心,算出所有点到这个点的距离,然后我们就能通过排序去o(n)地找出有多少对是满足的,但是这样很明显有的对是不正确的,就是这两个点的lca并不是当前重心的时候
我们可以想到,当且仅当两点在同一以重心儿子为根的子树中,才能发生错误,我们就可以单独求一次某个子树的不符合数量即可
然后我们删去当前重心,继续去看拆掉重心后的子树,然后重复之前的步骤即可
复杂度是O(nlognlogn)

错误及反思:

t了好多发,主要是没注意到maxn应该是每次dfs的时候都应该重新算,不重新算的话重心是错的
另外树分治的复杂度是可以保证的,每次取重心,所以最多logn次,每次遍历全部点,所以总体复杂度是nlogn

代码:

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 10100;
struct EDGE{
    int to,val,next;
}e[N*2];
int first[N],n,k,tot,si[N],maxn[N];
bool did[N];
vector<int> len;
void addedge(int x,int y,int z){
    e[tot].to=y;
    e[tot].val=z;
    e[tot].next=first[x];
    first[x]=tot++;
    e[tot].to=x;
    e[tot].val=z;
    e[tot].next=first[y];
    first[y]=tot++;
}
void dfs1(int now,int fa){
    si[now]=1;
    maxn[now]=0;
    for(int i=first[now];i!=-1;i=e[i].next)
        if(e[i].to!=fa&&!did[e[i].to]){
            dfs1(e[i].to,now);
            si[now]+=si[e[i].to];
            maxn[now]=max(maxn[now],si[e[i].to]);
        }
}
void dfs3(int now,int fa,int& root,int& num,int t){
    int MA=max(maxn[now],si[t]-si[now]);
    if(MA<num){
        num=MA;
        root=now;
    }
    for(int i=first[now];i!=-1;i=e[i].next)
        if(e[i].to!=fa&&!did[e[i].to])
            dfs3(e[i].to,now,root,num,t);
}
void dfs2(int now,int fa,int tlen){
    for(int i=first[now];i!=-1;i=e[i].next)
        if(e[i].to!=fa&&!did[e[i].to])
            dfs2(e[i].to,now,tlen+e[i].val);
    len.push_back(tlen);
}
int cal(int v,int d){
    len.clear();
    dfs2(v,-1,d);
    sort(len.begin(),len.end());
    int l=0,r=len.size()-1,ans=0;
    while(l<r){
        if(len[l]+len[r]<=k) ans+=r-l,l++;
        else r--;
    }
    return ans;
}
int solve(int now){
    int root,num=1e9;
    dfs1(now,-1);
    dfs3(now,-1,root,num,now);
    int ans=cal(root,0);
    did[root]=true;
    for(int i=first[root];i!=-1;i=e[i].next)
        if(!did[e[i].to]){
            ans-=cal(e[i].to,e[i].val);
            ans+=solve(e[i].to);
        }
    return ans;
}
void init(){
    tot=0;
    memset(first,-1,sizeof(first));
    memset(did,false,sizeof(did));
}
int main(){
    while(scanf("%d%d",&n,&k)&&n){
        init();
        for(int i=0,u,v,w;i<n-1;i++){
            scanf("%d%d%d",&u,&v,&w);
            addedge(u,v,w);
        }
        printf("%d\n",solve(1));
    }
}
(超详细)Scala环境搭建(scala-2.12.15、IDEA2021.1.3) Scala环境搭建(scala-2.12.15、IDEA2021.1.3) JunLeon——go big or go home 目录 Scala环境搭建(scala-2.12.15、IDEA2021.1.3) 一、Scala概述 1、什么是Scala? 2、Scala发展史 3、Scala与Java的关系 二、Scala环境搭建 1、环境准备 2、Scala安装与配置环境变量 3、验证Scala 三、编写第一个Scala程序 1、使用IDEA创建maven工程 2、. 阅读详情

相关推荐

Podman修改镜像源教程(附最新docker镜像源)

Podman修改镜像源教程(附最新docker镜像源)

道长的博客 4141

点分治练习1——P4178 Tree

蒟蒻的垂死挣扎 我好像有很久没有更博了。。。。不过觉得自己还是要记录一下的。 点分治支持在树上的询问操作,更多的是支持树上符合要求的路径的统计,形如 树上......的路径有多少 的问题一般就是点分治能解决的问题。 原理是每次处理出子树的重心,这样子树大小最少除以二,保证时间复杂度,然后强制统计经过重心的路径,保证程序的正确性。 这题可以说是模板题了 #include&lt;iostr...

Love_mona的博客 298

图形化界面无限转圈?CentOS 7的SELinux避坑指南(附命令行修复实录)

本文详细解析了CentOS 7图形界面启动时无限转圈或卡在'starting switch root'的故障原因,主要与SELinux安全策略冲突有关。提供了三种修复方案:临时禁用SELinux、重装策略包和精细调整策略,并分享了长期维护建议,帮助用户平衡系统安全性与可用性。

potato的博客 798

递归与分治策略--OJ例题

递推求解–高精度计算 实验题目一: 王老师爬楼梯,他可以每次走1级或者2级或者3级楼梯,输入楼梯的级数,求不同的走法数。(要求递推求解)如果N很大,需要高精度计算。 【Accepted】 OJ代码 #include<iostream> using namespace std; int main() { int i; int p, q; int s = 0;//判断第一个输出的数 ...

m0_46795297的博客 1858

基于CH32X035的USB双K型热电偶温度计:硬件设计、冷端补偿与信号放大详解

本文详细介绍了基于CH32X035单片机设计USB双K型热电偶温度计的完整方案。重点解析了硬件设计中的核心挑战:如何利用精密运放GS8552-SR进行信号放大,以及采用NTC热敏电阻和查表法实现精确的冷端补偿。项目通过USB供电通信,实现了双路高精度温度测量与显示,为电子爱好者和工程师提供了实用的参考设计。

weixin_42153793的博客 160

虚幻商城 Quixel 免费资产一键入库

在免费领取所有Megascans之后,我们只是有了获取 Quixel Megascans 资产的资格,但是没有入 Fab 库,本文将讲解通过脚本将 Quixel 所有资产入库 Fab。

一碗清深的博客 3305

分治总结+oj例题思路

 分治总结 一. 分治是一种扩大了的二分。即把一个大问题化成几个小问题来解决,和贪心有相似但也有区分。 鉴于oj未刷完,这里总结等刷完了再补充。 二.例题总结 1.“03:区间合并”    拿到题以为是水题,直接上结构体排序输出。当然WA了。百思不得其解后百度给了我答案。    如果某一个区间的右端点十分靠右,那最终合并后的区间的右端点不应该

Ember的博客 725

财务惊呼“不可能”!Python 自动识别 PDF 发票,数据秒级录入系统

电子发票(原生 PDF):这种最爽,文字是可以选中的。我们用 PyPDF2 直接提取文本,速度快,准确率 100%。 纸质扫描/拍照发票:这种是图片。必须上 OCR(光学字符识别)。我们要用百度开源的 PaddleOCR,这是目前中文识别效果最好的开源库之一,吊打早已过气的 Tesseract。

BUG猿的博客 1024

【POJ1741】 点分治

POJ1741 和上一篇博客蛮像的 问的是小于等于k的有多少个 /* if you can't see the repay Why not just work step by step rubbish is relaxed to ljq */ #include <cstdio> #include <cstring> #include <...

我是谁 --- 卡比兽 176

Android 埋点信息分析——statsd框架

StatsPullAtomService 用以采集数据,并将数据填充到参数中,在StatsManager.PullAtomCallbackInternal 中会转换成 Parcel 格式传入到 native。 StatsCallbackPuller::PullInternal 中会回调StatsManager.PullAtomCallbackInternal 的onPullAtom,该函数中会回调StatsCallbackPuller::PullInternal 中定义的PullResultRecei

私房菜 2628

嵌入式u-boot最全面试题及参考答案(5万字长文持续更新)

例如,在一个便携式设备中,U-Boot 在启动时初始化电源控制器,将输出电压设置为合适的值。命令是u-boot构建过程中用于配置u-boot选项的命令。在嵌入式系统中,启动画面(也称为启动Logo或Splash Screen)是展示给用户的第一印象,它可以包含公司的标志、产品的名称或其他相关信息。u-boot允许通过环境变量来进行配置,这使得开发者可以根据不同的硬件平台和项目需求灵活地调整u-boot的行为。写入操作可以是字节级别的,也可以是块级别的,具体取决于设备的性能和操作系统的需求。

大模型大数据攻城狮的专栏 997

POJ 1741(点分治)

Tree Time Limit:1000MS Memory Limit:30000K Total Submissions:33152 Accepted:11082 Description Give a tree with n vertices,each edge has a length(positive integer less than 10...

cgtllp1的博客 224

SAP 消息号T-CODE

SAP消息号修改汇总 确实有很多消息是可以修改的 FI: oBA5|oFMG|oFPM MM: oMRM|oKZZ|oMT4|oMCQ|o04C| SD: oVAH(V4)|oVM1(VL) CO:  oPR4_ACT|oPR4_CK|oPR4_CKML|oPR4_CKPF|oPR4_KKA|oPR4_KKP|oPR4_KKS| oPR4_KKS1|oPR4_P

heng0757的专栏 1万+

POJ 1741 Tree, 树的重心, 树分治, 点分治

最近在学习树的分治,算是比较难,而且代码量比较大的一块。随便拿一道题来就有上百行,故写一篇文章来总结一下这方面的框架。 POJ这一题应该算是树分治的入门题,顺便用这一题来详细说明树分治的一些具体内容。 http://poj.org/problem?id=1741 Tree Time Limit: 1000MS Memory Limit: 30000K Desc

Stitch_11752的博客 1325

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Poj1741 Tree(树分治)

Poj1741 Tree(树分治) 题目描述 给出一棵树,求出其中有多少点对满足点之间的路径小于某个值K 解题思路 路径可以分成树间路径和树内路径。对于树间路径只需要满足两点到树的根节点的距离之和小于等于k则满足条件。只要对树间路径进行容斥即是答案。为此需要根据根节点进行递归容斥,通过树分治的思想,每次找树的中心进行计算可以将递归次数降到到log(n),算上每次枚举需要对子树的所有边进行排序,因此...

FLY_WHITE的博客 265

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

POJ 1741 Tree【树分治】

第一次接触树分治,看了论文又照挑战上抄的代码,也就理解到这个层次了。。 以后做题中再慢慢体会学习。 题目链接: http://poj.org/problem?id=1741 题意: 给定树和树边的权重,求有多少对顶点之间的边的权重之和小于等于K。 分析: 树分治。 直接枚举不可,我们将树划分成若干子树。 那么两个顶点有两种情况: ...

An55511的博客 185

POJ 1741 Tree 树分治

Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=1741 Description Give a tree with n vertices,each edge has a length(positive integer less than 1001).Define dist...

YZ930035683的博客 168

poj 1741 - Tree 树分治

题目链接: http://poj.org/problem?id=1741 题意: 给一棵树,树上每条边都有权值,问你树上两个点之间的距离不超过K的点对有多少个。 思路: 看2009年国家集训队 漆子超 的论文 >。 文中已经把大概的解题思路都将清楚了,但是作为第一次写树分治的我来说依旧是茫然一片。。。 于是只能依靠网上的大牛了。。 这题融汇了很多的思想,细细品味后感觉收货还是挺大的。

呼,是出一口气;吸,是争一口气! 685

poj 1741 Tree - 树分治

  Give a tree with n vertices,each edge has a length(positive integer less than 1001).Define dist(u,v)=The min distance between node u and v.  Give an integer k,for every pair (u,v) of vertices ...

adx33526的博客 177

poj 1741 Tree | 树分治

题意: 给你一棵树,让你找

568

[POJ 1741]Tree[树分治]

题目链接:[POJ 1741]Tree[树分治] 题意分析: 统计树上一共有多少对结点,两者之间的最短距离不超过k。 解题思路: 1e4个点,暴搜肯定是不行的。这里我们采用树分治来解决这个问题。 大体思路:将树不断地划分成两块——>以划分点作为“中间点”(我们称为重心),统计该点周围点到该点的距离ds[],统计ds[]+ds[]小于等于k的对数——>回归上层继续计算 总结来说就是:划分

闲停 711

POJ 1741 Tree ——(树分治)

  思路参考于:http://blog.youkuaiyun.com/yang_7_46/article/details/9966455,不再赘述。   复杂度:找树的重心然后分治复杂度为logn,每次对距离数组dep排序复杂度为nlogn,而找重心的复杂度为dfs的复杂度——O(n),因此总的复杂度为O(nlognlogn)。   因为第一次写树分治,留个代码: 1 #include...

ddmxynl793173的博客 105

【树分治】 POJ 1741 Tree

树分治入门题。。。树分治介绍和此题的解法国家集训队论文里都有。。。请看这里http://wenku.baidu.com/link?url=zeAfV5y_bqZ4Y_2EzHQpnXcZIhW6yo4ExY55HRwb4GyOwjybwL9EgcIzTYOehKRS_8hnJY7MT2s18kfiqDGApFn7ekHPZS_ZEQN87xP3Rfe #include #include #i

yysys 488

Tree POJ - 1741【树分治】【一句话说清思路】

Tree POJ - 1741【树分治】【一句话说清思路】 因为该博客的两位作者瞎几把乱吹(〃 ̄︶ ̄)人( ̄︶ ̄〃)用彼此的智慧总结出了两条全新的定理(高度复杂度定理、特异根特异树定理),转载请务必说明出处。(逃 Pass:anuonei,anuonei(臭不要脸学血小板),真的是瞎几把乱搞,我感觉大部分人都不需要这些东西吧,当初研究...

qq_40840311的博客 188
上一篇: UVA 11983 Weird Advertisement (线段树扫描线)
下一篇: bzoj 2152 聪聪可可 (树分治)
Roll_Keyboard
博客等级 码龄9年 10粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值