LGP9755 [CSP-S 2023] 种树 学习笔记

news/2025/9/27 11:16:44/文章来源:https://www.cnblogs.com/OrinLoong/p/19114868

LGP9755 [CSP-S 2023] 种树 学习笔记

Luogu Link

前言

故地重游。

巧合的是,上次写这道题刚好是在去年的九月二十七日,整整一年前。

题意简述

给定一个 \(n\) 个点,\(n-1\) 条边的简单无向连通图。

好吧,这片地本身的形态也是一棵树。

你的目标是:在每个结点上种一棵树,使其长到不低于 \(a_i\) 米。

你每天可以选择一个未种树且与已种树结点邻接的结点,种一棵高度为 \(0\) 米的树。若所有地块均已种树,则你当天不进行任何操作。特别地,第一天你只能在 \(1\) 号空地种树。

对每个地块而言,从该地块被种下树的当天开始,该地块上的树每天都会生长一定的高度。由于气候和土壤条件不同,在整个任务的第 \(x\) 天结束时,\(i\) 号地块上的树会长高 \(\max(b_i+x\times c_i,1)\) 米。注意这里的 \(x\) 是从整个任务的第一天,而非种下这棵树的第一天开始计算。

你想知道:最少需要多少天能够完成你的任务?

\(n\le 10^5\)\(1\le a_i\le 10^{18}\)\(1\le b_i\le |c_i|\le 10^9\)。保证存在方案能在 \(10^9\) 天内完成任务。

做法解析

显然树越早种下去越好。整个问题是可以二分判断的。

二分时怎么判断呢?我们发现对于某个截止时间,每个结点都有一个最晚需要种树的时间点 \(lst_u\),这东西也是可以二分求的。除此之外,\(lst_u\) 也要对 \(lst_v-1\) 取最小值。最后你从 \(1\) 开始贪心地选最急迫的结点就行了。

在二分 \(lst_u\) 的时候你会需要计算 \(\sum_{i=l}^r\max(b_i+x\times c_i,1)\)

\(c_i\ge 0\) 的情况是好求的(题目保证了 \(b_i\ge 1\) 很舒服,我们不用考虑 \(b_i+x\times c_i\) 单增但不恒大于 \(1\) 的可能性)。

对于 \(c_i<0\) 的情况你需要先解一下 \(b_i+x\times c_i\ge 1\) 这个不等式。由于负数取模取整很麻烦,我们选择将其移项为 \(-c_i\times x\le b_i-1\),得 \(x\le\lfloor\frac{b_i-1}{-c_i}\rfloor\)。然后分段计算即可。

这样我们就在 \(O(n\log V\log n)\) 的时间复杂度内解决了此问题。

代码实现

注意会出现 \(V_c\times n^2\) 规模的运算,所以 calc 里面记得该开 __int128 的地方要开。

#include <bits/stdc++.h>
using namespace std;
using namespace obasic;
const int MaxN=1e5+5;
int N,X,Y;lolo A[MaxN],B[MaxN],C[MaxN];
vector<int> Tr[MaxN];
void addudge(int u,int v){Tr[u].push_back(v);Tr[v].push_back(u);
}
molo calc(int u,lolo lb,lolo rb){if(C[u]>=0)return B[u]*(rb-lb+1)+(lb+rb)*(rb-lb+1)/2*molo(1)*C[u];int bkp=(B[u]-1)/-C[u];if(bkp<lb)return rb-lb+1;if(rb<=bkp)return B[u]*(rb-lb+1)+(lb+rb)*(rb-lb+1)/2*molo(1)*C[u];return B[u]*(bkp-lb+1)+(rb-bkp)+(lb+bkp)*(bkp-lb+1)/2*molo(1)*C[u];
}
int lst[MaxN];
int getlst(int u,int lim){int sl=1,sr=N,smid,res=0;while(sl<=sr){smid=(sl+sr)>>1;if(calc(u,smid,lim)>=A[u])res=smid,sl=smid+1;else sr=smid-1;}return res;
}
void dfs(int u,int f){for(int v : Tr[u]){if(v==f)continue;dfs(v,u),minner(lst[u],lst[v]-1);}
}
bool solve(int lim){for(int i=1;i<=N;i++){lst[i]=getlst(i,lim);if(!lst[i])return false;}dfs(1,0);sort(lst+1,lst+N+1);for(int i=1;i<=N;i++)if(lst[i]<i)return false;return true;
}
int main(){readi(N);for(int i=1;i<=N;i++)readis(A[i],B[i],C[i]);for(int i=1;i<N;i++)readis(X,Y),addudge(X,Y);int sl=N,sr=1e9,smid,ans;while(sl<=sr){smid=(sl+sr)>>1;if(solve(smid))ans=smid,sr=smid-1;else sl=smid+1;}writi(ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/919390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7、revision 是 Maven 3.5+ 引入的现代版本管理机制 - 实践

7、revision 是 Maven 3.5+ 引入的现代版本管理机制 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

P1731 生日蛋糕 做题记录

洛谷P1731 生日蛋糕 做题记录 题意简述 一个生日蛋糕由几个圆柱体组成,每个圆柱体的底面半径和高从下到上严格递减,现给出蛋糕的体积 N pi 以及层数 M,试求蛋糕的最小表面积。 思路速通 基本为 DFS ,对于每层的半径…

详细介绍:【MySQL】MySQL数据库入门指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

如何有效提升代码覆盖率:从单元测试到集成测试的实践指南

Go语言代码覆盖率实现 一、什么是代码覆盖率代码覆盖率是软件测试中的一种白盒测试度量指标,表示程序源代码中被执行的比例。简单来说,就是“我的测试到底跑过多少代码”。 覆盖率常见的几种标准:语句覆盖(段覆盖、…

深入解析:SSM网络游戏交易系统a9n72(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面

深入解析:SSM网络游戏交易系统a9n72(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto …

Spring知识点(2)

一、有哪些依赖注入方式?构造方法注入:通过调用类的构造方法,推荐用于强依赖(没有依赖对象就没法工作)。这也是官方推荐的注入方式。好处:依赖不可变(final修饰)、更安全。@Component public class UserServic…

成都电子商务网站建设非寻服饰网站建设规划书

文章目录 “预训练微调大模型”的模式以提示/指令模式直接使用大模型“预训练微调大模型”模式和Prompt/Instruct模式的异同小结 “预训练微调大模型”的模式 经过预训练的大模型所习得的语义信息和所蕴含的语言知识&#xff0c;很容易向下游任务迁移。NLP应用人员可以根据自己…

超越实习期的AI自动化工具:播客工作流与Slack导出器实战

本文详细介绍实习期间基于Claude AI模型开发的两个自动化工具:播客工作流年省1250小时人工,Slack导出器实现智能知识检索。包含技术架构、问题解决方案和实际应用效果,展现AI如何增强企业工作效率。超越实习期的实习…

调度器的各项指标以及计算方式

CPU利用率 \[利用率=\frac{忙碌的时间}{总时间} \]系统吞吐量 单位时间内完成作业的数量 \[系统吞吐量=\frac{总共完成了多少道作业}{总共花了多少时间} \]周转时间 1.周转时间-平均周转时间\[作业周转时间=作业完成时…

​CentOS 7 安装 net-tools.rpm 包步骤详解(附 rpm 命令和 yum 方法)​附安装包

​CentOS 7 安装 net-tools.rpm 包步骤详解(附 rpm 命令和 yum 方法)​附安装包​一、先确认你的系统是 CentOS 7 或 RHEL 7 这个包是专门给 ​CentOS 7​ 或者 ​RHEL 7​(也就是 64 位系统)用的,文件名里的 el7…

青原区城乡建设局门户网站网站建设的系统简介

Kibana是一个开源的分析与可视化平台&#xff0c;设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。是es的可视化客户端之一。 一&#xff1a;下载 https://www.elastic.co/cn/kibana 我的es是elasticsearch-7.10.2版本&#x…

深入解析:【Linux】UDP 网络编程

深入解析:【Linux】UDP 网络编程2025-09-27 11:02 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !impor…

浅谈dsu on tree

前言 先学树剖。 讲讲启发式合并,最经典的就是并查集的按秩合并,这里不细讲。 常用的启发式合并就是小集合合并到大集合上,复杂度从 \(O(n^2)\) 优化至 \(O(n \log n)\)。 例题 P3201 [HNOI2009] 梦幻布丁 题目描述…

天河手机网站建设网站建设 讲话

目录 pod启动创建过程 kubelet持续监听的原因 调度概念 调度约束 调度过程 优点 原理 优先级选项 示例 指定调度节点 标签基本操作 获取标签帮助 添加标签&#xff08;Add Labels&#xff09;&#xff1a; 更新标签&#xff08;Update Labels&#xff09; 删除标…

Linux目录下有100百万个文件,如何快速删除

Linux目录下有100百万个文件,如何快速删除Linux目录下有100百万个文件,如何快速删除 利用rsync命令 例:删除/root/files目录下的所有文件ls -l -f /root/files > /tmp/filelist.txt //将目录下的所有文件整理到/…

JavaDay10

Super详解 super注意点: ​ 1.super调用父类的构造方法,必须在构造方法的第一个 ​ 2.super必须只能出现在子类的方法或者构造方法中! ​ 3.super和this不能同时调用构造方法 对比 this: ​ 代表的对象不同: ​ …

29.Linux防火墙管理 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【转】中国信通院《低代码产业发展研究报告(2025年)》核心解读

【转】中国信通院《低代码产业发展研究报告(2025年)》核心解读中国信通院(CAICT)于2025年6月发布的《低代码产业发展研究报告》是中国低代码行业发展的权威性风向标。这份报告不仅全面梳理了低代码市场的最新发展现…

【C++】内存管理 - 指南

【C++】内存管理 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…

昇腾多机推理极速上手:10倍简化的 DeepSeek R1 超大规模模型部署

昇腾多机推理太复杂?易出错?试试 GPUStack在昇腾 NPU 上部署超大规模模型,往往面临一个现实难题:目前主流的官方推理引擎 MindIE 的多机分布式推理虽然性能表现尚可,但配置流程异常复杂。从环境准备、配置初始化到…