牛客练习赛67 F.牛妹的苹果树(树的直径/倍增 线段树)

【poj 3321】Apple Tree 题意&题解&代码(C++) poj 线段树 阅读详情

题目

牛妹种了一棵苹果树。

这棵苹果树有n(n<=3e5)个节点,n-1条边,每一条边都有一个权值wi(1<=wi<=1e9)​。

我们定义:这棵树上的两点之间距离dist(u,v)为它们简单路径上所有边的权值和。

现在,牛妹想给你q(q<=3e5)次询问,每次询问一个区间[l,r],求max(dist(u,v)),l\le u\le v\le r。

思路来源

syh0313代码

题解

首先,考虑如果有两个连通块,如何合并,

(a1,b1)是第一个连通块直径,(a2,b2)是第二个连通块直径,

则合并之后的连通块直径不会劣于(a1,b1)(a2,b2)(a1,a2)(b1,b2)(a1,b2)(b1,a2)六者的最大值,

反证法可以考虑第一个连通块取一个点c,第二个连通块取一个点d,

考虑a2、b2、d三个点路径的交点p,|a2p|>|dp|,|b2p|>|dp|

则无论p向哪个方向移动时,max(|a2p|,|b2p|)>|dp|,

这表明当p挪到与c重合时,将d换为a2或b2中的一个点更优,

同理可以把c换成(a1,b1)中的点

 

于是就可以合并了,先ST表RMQ预处理lca,

ans[i][j]表示i后长为1<<j的区间的连通块(只考虑这些点号)的直径的点对(a,b)

倍增预处理步长,合并时对六者取最大值做合并,

查询时,即对覆盖的两个最大子区间做合并即可,

也可以用线段树实现,父节点的区间为lson和rson的合并

代码

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
typedef pair<int,int> P;
typedef long long ll;
const int N=3e5+10,M=2*N;
vector<P>E[N];
int n,q,u,v,w,l,r;
int lg2[M],dfn[M],tot,dep[M],id[N],dp[M][22];
P ans[N][22];
ll dis[N];
void dfs(int u,int fa,int d){
	id[u]=++tot;
	dfn[tot]=u;
	dep[tot]=d;
    for(int i=0;i<E[u].size();++i){
		int v=E[u][i].fi,w=E[u][i].se;
		if(v==fa)continue;
		dis[v]=dis[u]+w;
		dfs(v,u,d+1);
		dfn[++tot]=u;
		dep[tot]=d;
	}
}
void ST(){
	for(int i=1;i<=tot;++i){
        dp[i][0]=i;
	}
	for(int len=1;(1<<len)<=tot;++len){
		for(int l=1;l+(1<<len)-1<=tot;++l){
			if(dep[dp[l][len-1]]<dep[dp[l+(1<<(len-1))][len-1]])dp[l][len]=dp[l][len-1];
			else dp[l][len]=dp[l+(1<<(len-1))][len-1];
		}
	}
}
int RMQ(int l,int r){//返回最小值下标
	int len=lg2[r-l+1];
	if(dep[dp[l][len]]<dep[dp[r-(1<<len)+1][len]])return dp[l][len];
	else return dp[r-(1<<len)+1][len];
}
int lca(int u,int v){
	int mn=min(id[u],id[v]);
	int mx=max(id[u],id[v]);
	return dfn[RMQ(mn,mx)];
}
ll cal(int u,int v){
    return dis[u]+dis[v]-2ll*dis[lca(u,v)];
}
bool upd(ll &x,ll y){
    if(x<y){
        x=y;
        return 1;
    }
    return 0;
}
P unite(P a,P b){
    ll d=0;
    P res;
    if(upd(d,cal(a.fi,a.se)))res=P(a.fi,a.se);
    if(upd(d,cal(b.fi,b.se)))res=P(b.fi,b.se);
    if(upd(d,cal(a.fi,b.fi)))res=P(a.fi,b.fi);
    if(upd(d,cal(a.fi,b.se)))res=P(a.fi,b.se);
    if(upd(d,cal(a.se,b.fi)))res=P(a.se,b.fi);
    if(upd(d,cal(a.se,b.se)))res=P(a.se,b.se);
    return res;
}
ll ask(int l,int r){
	int len=lg2[r-l+1];
	P now=unite(ans[l][len],ans[r-(1<<len)+1][len]);
    return cal(now.fi,now.se);
}
int main(){
    scanf("%d%d",&n,&q);
    for(int i=2;i<M;++i){
        lg2[i]=lg2[i>>1]+1;
    }
    for(int i=1;i<n;++i){
        scanf("%d%d%d",&u,&v,&w);
        E[u].pb(P(v,w));
        E[v].pb(P(u,w));
    }
    dfs(1,-1,0);
    ST();
    for(int i=1;i<=n;++i){
        ans[i][0]=P(i,i);
    }
    for(int len=1;(1<<len)<=n;++len){
        for(int l=1;l+(1<<len)-1<=n;++l){
            ans[l][len]=unite(ans[l][len-1],ans[l+(1<<(len-1))][len-1]);
        }
    }
    while(q--){
        scanf("%d%d",&l,&r);
        printf("%lld\n",ask(l,r));
    }
	return 0;
}

 

NOI 2.3.666放苹果 题解(C++) NOI 2.3.666放苹果 题解(C++) 这一次的题目可以说是非常的仁道了,连我这种浑身100%水分的人都可以不看题解解决 [滑稽],不知道对各位AK IOI的巨佬怎么样 【原题地址】请猛戳 懒得动手的就看下面的吧 666:放屁股 放苹果 总时间限制: 1000ms 内存限制: 65536kB 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表... 阅读详情

相关推荐

用Linkboy玩转Arduino:3小时搞定智能倒车雷达(附仿真文件下载)

本文详细介绍了如何利用Linkboy图形化编程工具,在3小时内快速搭建一个基于Arduino的智能倒车雷达项目。通过仿真环境,初学者无需硬件即可学习超声波测距原理、报警逻辑设计,并完成从虚拟仿真到实体硬件的完整流程。文章提供了清晰的步骤、调试技巧及功能扩展思路,并附有仿真文件,是入门Arduino和智能硬件制作的绝佳实践指南。

weixin_29159441的博客 402

牛客练习赛67 F-牛妹的苹果树(树上最远点对/区间带权直径-线段树+LCA)

题目链接:https://ac.nowcoder.com/acm/contest/6885/F 博客园食用链接: 题目描述 牛妹种了一棵苹果树。 这棵苹果树有n个节点,n-1条边,每一条边都有一个权值wiw_iwi​我们定义:这棵树上的两点之间距离dist(u,v)dist(u,v)dist(u,v)为它们简单路径上所有边的权值和。 现在,牛妹想给你q次询问,每次询问一个区间[l,r],求max(dist(u,v)),l≤u≤v≤rmax(dist(u,v)),l\le u\le v\le rmax(dis

孤风的博客 485

2023年5月青少年软件编程Python等级考试四级真题(含答案和解析)

电子学会,2023年5月,青少年软件编程,Python等级考试,四级真题(含答案和解析)

m0_37554648的博客 903

F-牛妹的苹果树(直径合并)

题目链接 题意: 一棵nnn个结点的树,每条边有个边权wiwiwi。有qqq次询问,每次询问lll和rrr,求max(dist(u,v)),l≤u≤v≤rmax(dist(u,v)),l\leq u\leq v\leq rmax(dist(u,v)),l≤u≤v≤r。 (1≤n,q≤300000)(1\leq n,q\leq 300000)(1≤n,q≤300000) 做法: 这里有一个结论:已知两个子图的直径端点,那么两个图合并后的直径,就在这四个点中取最远的两个点。 所以这题考虑倍增处理出ST表。需要两

Zimba_的博客 316

WPS和Excel通用!省市区四级联动下拉菜单保姆级教程(附最新行政区划数据包)

本文详细介绍了在WPS和Excel中实现省市区四级联动下拉菜单的完整教程,包含2024年最新行政区划数据的获取与整理方法。通过名称管理器和INDIRECT函数的组合,以及WPS的特色功能,帮助用户高效准确地录入四级行政区划信息,提升数据录入效率并减少错误。

s1t2u3的博客 609

OpenWrt kmod内核不兼容?手把手教你用脚本强制安装驱动模块(附国内镜像源)

本文详细解决了OpenWrt kmod内核不兼容问题,提供智能脚本强制安装驱动模块的方法,并附有国内镜像源加速配置。通过自动化脚本修改内核MD5校验值,确保kmod包正常安装,同时推荐多个国内镜像源以提升下载速度。

weixin_42549451的博客 539

牛妹的苹果树【牛客练习赛67 F】【倍增+欧拉序+树的直径】

题目链接 求区间内的点对的最大直径。 其实,我们可以发现直径有相对应的传递关系的,如果我们已知一棵树上的直径,,假设又知道另一棵树上的直径,,那么新的直径只能通过这四个点两两组和来实现的。 所以,我们可以用倍增的方法来维护这个连续关系对。 9 1 1 2 1 1 3 2 1 4 3 1 5 5 1 6 6 2 7 7 3 8 4 4 9 2 6 7 ans:14 #include <iostream> #include <cstdio> #include ...

既然弱小,就只顾变强就是了 257

Qt上位机实战:5步搞定STM32 IAP固件升级(附拖拽文件处理技巧)

本文详细介绍了如何使用Qt开发STM32 IAP固件升级上位机。通过五个核心步骤,包括理解IAP机制、搭建Qt环境、实现拖拽文件加载、封装串口通信以及设计可靠通信协议,帮助开发者快速构建一个稳定、易用且支持图形化操作的固件升级工具,显著提升嵌入式产品开发与维护效率。

ss78901的博客 1070

牛客练习赛67 F.牛妹的苹果树

题目链接 思路:考虑st表的思想。设st[i][j]st[i][j]st[i][j]表示[i,i+2j][i,i+2^j][i,i+2j]区间的点 构成的的树的直径的两个端点。转移就是从4个点选两个。就可以预处理出st数组。询问就是合并两个st的元素。 算是一类树上问题的技巧吧。学习到了。 #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc++.h> using namespace std; typedef lo

pubgoso的博客 257

运算放大器 VS 仪表放大器

运算放大器(Operational Amplifier, 简称 Op Amp)和仪表放大器(Instrumentation Amplifier, 简称INA)在电子电路设计中都有非常广泛的应用,但两者在结构、特性以及应用场景上都有明显的区别。以下是它们之间主要的差异:运算放大器(Op Amp)仪表放大器(INA)运算放大器仪表放大器运算放大器仪表放大器运算放大器仪表放大器运算放大器仪表放大器总之,运算放大器是通用型放大元件,需要设计者自己做额外的电路配置;而仪表放大器则是针对高精度测量差分信号而生,内部匹配

chinahongjiang的博客 1346

【2026年华为暑期实习/秋招(AI)-8月5日-第一题- 选择题】(题目+思路+Java&C++&Python解析+在线测试)

摘要: 本文包含20道选择题,涵盖深度学习、数值计算、概率统计、线性代数及机器学习等领域。重点考察了Softmax的数值稳定性实现(减去最大值)、视觉问答任务(图像+问题→答案)、分层强化学习的奖惩计算、欧氏距离与余弦相似度、反向传播梯度计算、SVD降维存储优化、贝叶斯概率推断、插值多项式等。此外,涉及逻辑回归评价指标(不含MSE)、端侧推理内存因素(中间激活)、集中趋势度量(均值)、Householder变换性质、早期停止正则化、梯度矩阵秩与优化、在线学习特性及大模型训练技巧(如学习率预热、梯度裁剪)等知

m0_73659489的博客 190

牛客205089 牛妹的苹果树

倍增

Irving0323的博客 216

《UDS协议从入门到精通》系列——到底什么是DTC?

到底什么是DTC?看这里,深度图解DTC格式,详述DTC状态位、快照信息和扩展信息!!

车载系统攻城狮 1万+

CSP201909-1 小明种苹果 (Python)

文章目录题目程序代码 题目 试题编号: 201909-1 试题名称: 小明种苹果 时间限制: 2.0s 内存限制: 512.0MB 题目描述   小明在他的果园里种了一些苹果树。为了保证苹果的品质,在种植过程中要进行若干轮疏果操作,也就是提前从树上把不好的苹果去掉。第一轮疏果操作开始前,小明记录了每棵树上苹果的个数。每轮疏果操作时,小明都记录了从每棵树上去掉的苹果个数。在最后一轮疏果操作结束后,请帮助小明统计相关的信息。 输入格式   从标准输入读入数据。   第

qq_45899597的博客 826

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

C++题解:苹果树

题目 1500ms 131072K 蒜头君的庄园里有一棵苹果树,树上有N个节点被N−1个树枝相连,蒜头君分别将它们标号为1到N,其中根为1号节点,每个节点开始的时候都有苹果,不过树上的苹果也是在变化的,有时某个节点会长出一个苹果,有时某个节点的苹果会被摘掉,蒜头君想知道某时刻某节点及其子树上一共有多少苹果,请你帮帮他。 输入格式 输入第一行两个整数 N,M,表示一共有N个节点,M次操作(节点状态更改或询问)(1≤N,M≤106)。 接下来N - 1行,每...

Keven_11的博客 2265

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

「csp模拟试题 201909-2」小明种苹果(续)C/C++ 100分

目录 题目 输入输出样例 题解思路 题解源码(c/c++) 题目 :小明种苹果(续) 【问题描述】 小明在他的果园里种了一些苹果树,这些苹果树排列成-一个圆。为了保证苹果的品.质,在种植过程中要进行疏果操作。为了更及时地完成疏果操作,小明会不时地检查每棵树的状态,根据需要进行疏果。检查时,如果发现可能有苹果从树上掉落,小明会重新统计树上的苹果个数(然后根据之前的记录就可以判断是否有苹果掉落了)。在全部操作结束后,请帮助小明统计相关的信息。 【输入格式】 从标准输入读入数据。 第 1 行包含一个正整数 N

qq_44906900的博客 1141

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

NOIP 2018普及组复赛C++详细题解报告(1)

第1题 标题统计 一、代码 #include &lt;iostream&gt; #include &lt;cstdio&gt; using namespace std; int main() { freopen("title.in", "r", stdin); freopen("title.out", "w", stdout); string title; get

小树学信奥 1831

SDNU 1171.合并果子(区间dp)

Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。 因为还要花大力气把这些果子搬回家,所...

weixin_30780221的博客 501

【51nod1531】树上的博弈

题目描述 有一棵n个点的有根树,他有m个叶子结点(叶子结点是那些没有孩子的结点)。边由父亲指向孩子。数字1到m被分配到每一个叶子中。每一个叶子有一个数字,并且每一个数字恰好被分配到一个叶子中。 刚开始的时候根部有一个棋子。两个玩家轮流移动棋子,每一步都会将这个棋子向他的某一个孩子移动;如果玩家不能再移动棋子了,那么游戏结束。游戏的结果就是棋子所在叶子上面的数字。游戏的先手想要这个数字最大化,而

dcx2001的博客 1169

牛客练习赛67 牛妹的苹果树

题意:输出给定的点序号区间中两点间距离的最大值 思路: 考虑倍增思想,st[u][i] 代表从u号节点开始往后2^i个连续数中的直径的两个端点。 st[u][i] 一定是由 st[u][i-1] 和 st[u + 2^(i-1)][i-1]转移过来的 思考怎么转移,显然对应6种情况 1.若两个块中的直径的端点俩俩之间不存在LCA,那么显然直径存在与两个块中的其中一个(2种) 2.若两个块中的直径的端点俩俩之间存在LCA,那么显然对应四种情况,只需要选出其中最大的点对即可 //#define

Zenith_Habitant的博客 221

P2015 二叉苹果树 树上dp+分组背包

P2015 二叉苹果树 题目大意: 有一颗树,根是 1 ,每条边上有对应的权值,保留 q 条边,问剩下的权值最多可以是多少,剩下的边一定要和根节点联通。 思路: dp[i][j]dp[i][j]dp[i][j] 表示第 iii 个节点保留 jjj 条边的最大权值,那么答案就是 dp[1][q]dp[1][q]dp[1][q]。 发现是树上 dpdpdp 的分组背包,每个节点都是对应的组,每个组内的物品有 qqq 个,每个节点的贡献只能计算一次,那就是裸的分组背包 第一层循环遍历节点等价于遍历组 第二层循环遍

想学开哥的博客 287

树形动态规划题集

测试地址 部分题面可能复制有问题,图片没有复制,有疑惑见原题面。 1575:【例 1】二叉苹果树 问题描述 有一棵二叉苹果树,如果数字有分叉,一定是分两叉,即没有只有一个儿子的节点。这棵树共 N 个节点,标号 1 至 N,树根编号一定为 1。 我们用一根树枝两端连接的节点编号描述一根树枝的位置。一棵有四根树枝的苹果树,因为树枝太多了,需要剪枝。但是一些树枝上长有苹果,给定需要保留的树枝数量,求最多...

帅比王的博客 1577

Codeforces Round 914 (Div. 2) E. Tree Queries(dfs序/欧拉序性质+树的直径性质+线段树)

若in[a]<in[b]<out[a],说明b在a的子树里,一定有in[a]<in[b]<=out[b]<=out[a]a的dfs序对应[in[a],out[a]],b的区间对应[in[b],out[b]]2. x所在的连通块能到的最远点,一定是x这个连通块的直径的两个端点中的一个。新的树的直径的两个端点,一定是在原来两棵树直径的四个点里选两个点。利用上文提到的树的直径的性质,统一merge合法区间的直径,剩下的区间都是x的可达区间,每个区间对应一个连续的dfs序。

小衣同学的博客 848

Codeforces Round 868 (Div. 2) F. Random Walk(树上期望)

②对于s->t链上的点u(u可以等于s,u不可以等于t),将u和s->t链之间的边断开后,u的子树内的点。若走到t,则停止,问每个点经过的期望次数,答案对998244353取模。①s->t这条链,将这条链上的边定向,经过的次数,正向边=反向边+1。①部分,为点3、点4、点5,即3->4->5这条链。③将t与s->t链之间的边断开后,t的子树内的点。举个例子,以n=6,s=3,t=5这棵树为例。2. 当i=t时,一条边i->x走的次数。,其中u->v为正向边,v->u为反向边。,其中d[i]为点i的度。

小衣同学的博客 800

2020 计蒜之道 预赛 第二场 D. 虫洞(困难)(O(n) bfs序+树上差分+树链求并+tarjan求lca)

题目 简化题意,1为根的有根树 点i对应一个权值wi,wi在[0,n]之间 对于每个i,问在其子树中有多少种深度d, 满足该深度下存在两个点a、b,使得(x是给出的值,也在[0,n]之间) 对于这个i,计其答案为ans[i], 要求输出对998244353取模的值 思路来源 官方题解 题解 O(nlogn)的做法由于写的比较搓,怎么写怎么T,最后无奈写O(n) bfs的过程中,一边bfs一边尺取, tong[x]维护值为x时当前出现的最大的bfs序下标, 能更新当且仅当v所需要的t

小衣同学的博客 788

Codeforces Round #838 (Div. 2) E. Tree Sum(组合数学 prufer序列 枚举边算贡献)

Codeforces Round #838 (Div. 2) E. Tree Sum(组合数学 prufer序列)

小衣同学的博客 700
上一篇: Codeforces Round #655 (Div. 2) F.Omkar and Modes(交互 题-分治+二分/纯分治)
下一篇: Link-Cut Tree(知识总结+板子整理)
小衣同学
博客等级 码龄9年 1444粉丝 995原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值