P6058 [加油武汉]体温调查:二分答案+最近公共祖先

本文探讨了一种树形结构问题,通过二分搜索找到树上根节点到连续叶节点距离的最大值最小解。文章详细介绍了如何使用DFS求解叶节点及相邻叶节点的LCA,以及二分搜索中检查函数的正确实现。

https://www.luogu.com.cn/problem/P6058

题目大意,求树上根节点到分段连续叶节点的距离的最大值最小。看到最大值最小,当然先往二分答案上去考虑了。

怎样求连续叶节点的距离呢?如下图所示dis[4]+(dis[6]-dis[lca(4,6)]+...

因此我们需要求出连续叶节点的Lca.一般情况下的LCA可以用倍增或者tarjan,但这个有点特殊,他是连续的叶节点的lca,我们在dfs的过程中只需要记录回溯后的深度最小的点,那么这个点就是其lca。因此我们可以仅用一次dfs求出需要的叶节点,叶节点到根节点的距离,相邻叶节点的LCA。

 

在做题的过程中总得40分,就以为自己LCA写错了,换了倍增求,还是一样的错。那就是二分的检查函数写错了,查了很久才发现,分段检查的时候忘了判断初始的dis[]是否符合要求。

还有一个问题,下面得代码开氧气优化会RE,可是本蒟蒻不知道为什么。

//二分答案,枚举距离检查。
//记录每个叶子节点最近的前一个叶子节点。,求每个节点与其相邻的叶子
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+10;
vector<pair<int,int> >g[N];
int n,k,Lca[N],Deep[N],mindep=1e9,minpoint=0;//记录其比他小的最近的节点v,和v的最近公共祖先。
int num=0,lef[N];
ll dis[N];
int dfs(int u,int fa,int dp,ll sumw) {
	dis[u]=sumw,Deep[u]=dp;
	for(int i=0; i<g[u].size(); i++) {
		int v=g[u][i].first;
		ll w=g[u][i].second;
		if(v==fa)continue;
		if(g[v].size()==1) {
			Lca[v]=minpoint;
			mindep=1e9;
			lef[++num]=v;
		}
		dfs(v,u,dp+1,sumw+w);
	}
	if(mindep>Deep[u])mindep=Deep[u],minpoint=fa;
}

bool check(ll x) { //计算距离x需要分几段。
	int cnt=1;
	ll sum=dis[lef[1]];
	for(int i=2; i<=num; i++) {
		if(sum>x)return 0;//一开始没想到这句,总得40分:(
		int v=lef[i],u=Lca[v];
		if(sum+dis[v]-dis[u]<=x)sum+=dis[v]-dis[u];
		else 
			cnt++,sum=dis[v];
		if(cnt>k)return 0;//需要的人手多余k个,这个时间太短了,增加时间
	}
	return cnt<=k; //时间还可以更少
}

int main() {
	scanf("%d%d",&n,&k);
	int u,v,w;
	ll l=0,r=0,mid,ans;
	for(int i=1; i<n; i++) {
		scanf("%d%d%d",&u,&v,&w);
		g[u].push_back(make_pair(v,w));
		g[v].push_back(make_pair(u,w));
		r+=(ll)w;
	}
	dfs(1,0,0,0);
	while(l<=r) {
		mid=(l+r)/2;
		if(check(mid))
			ans=mid,r=mid-1;
		else l=mid+1;
	}
	ans*=2;
	printf("%lld\n",ans);

}

 

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
数字图像隐写术是一种将秘密信息嵌入到数字图像中的技术,它通过利用人类视觉系统的局限性,在保持图像视觉质量的同时隐藏信息。这项技术广泛应用于信息安全、数字水印和隐蔽通信等领域。 典型隐写技术主要分为以下几类: 空间域隐写:直接在图像的像素值中进行修改,例如LSB(最低有效位)替换方法。这种技术简单易行,但对图像处理操作敏感,容易被检测到。 变换域隐写:先将图像转换到频域(如DCT或DWT域),然后在变换系数中嵌入信息。这类方法通常具有更好的鲁棒性,能抵抗一定程度的图像处理操作。 自适应隐写:根据图像的局部特性动态调整嵌入策略,使得隐写痕迹更加分散和自然,提高了安全性。 隐写分析技术则致力于检测图像中是否存在隐藏信息,主要包括以下方法: 统计分析方法:检测图像统计特性的异常,如直方图分析、卡方检测等。 机器学习方法:利用分类器(如SVM、CNN)学习隐写图像的区分特征。 深度学习方法:通过深度神经网络自动提取隐写相关特征,实现端到端的检测。 信息提取过程需要密钥或特定算法,通常包括定位嵌入位置、提取比特流和重组信息等步骤。有效的隐写系统需要在容量、不可见性和鲁棒性之间取得平衡。 随着深度学习的发展,隐写与反隐写的技术对抗正在不断升级,推动了这一领域的持续创新。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值