LGP10838 [FLA R1] 庭中有奇树 学习笔记

news/2025/10/15 2:23:28/文章来源:https://www.cnblogs.com/OrinLoong/p/19142440

LGP10838 [FLA R1] 庭中有奇树 学习笔记

\(\texttt{Luogu Link}\)

前言

时隔一年。

题意简述

给定一个有边权的无根树,大小为 \(n\)

\(\texttt{G}\) 要从 \(s\) 走到 \(t\),但是他有一次开挂机会,允许以 \(k\) 的代价在 \((x,y)\) 间连一条单向边。

\(\texttt{Y}\) 超级生气暴怒,所以他可以指定 \(m\) 个点对 \((x,y)\),使得小 \(\texttt{G}\) 在这些 \((x,y)\) 间连单向边的代价变为 \(10^9\)。特别规定,\((x,y)\) 在原树上不能有边相连。

两边都足够聪明,小 \(\texttt{Y}\) 希望最大化最终小 \(\texttt{G}\) 的行动代价,而小 \(\texttt{G}\) 则希望最小化自己的行动代价。小 \(\texttt{G}\) 可以看到小 \(\texttt{Y}\) 封锁的路线。问最终行动代价是多少。

\(2\le n\le 10^5\)\(0\le m,k\le 10^9\)\(1\le w_i\le 10^9\)\(s\neq t\)

做法解析

呃首先这个开挂只是多连一次单向边而已。所以实际上最终代价的组成方式结构也是简单的。就三类:

  • 不开挂。代价为 \(\text{dis}(s,t)\)
  • 我就直接开挂那咋了。直接从 \(s\) 传送到 \(t\),代价为 \(10^9\)。若 \(m=0\) 则代价为 \(k\)
  • 我们开挂是吃操作的要意识的。代价为 \(k+\text{dis}(s,x)+\text{dis}(y,t)\),其中 \((x,y)\) 是满足 \(\text{dis}(s,x)+\text{dis}(y,t)\)\(m+1\) 小的。因为 \((x,y)\) 只有 \((n-1)^2\) 个,所以若 \(m\ge (n-1)^2\) 则无需考虑。

\(\text{dis}(s,t)\) 通过 \(\texttt{DFS}\) 就求出来了。那么 \((x,y)\) 怎么找呢?答案是找不到。可我们也不关心 \((x,y)\) 本身,我们实际上只关心第 \(m+1\) 大的 \(\text{dis}(s,x)+\text{dis}(y,t)\) 的长度。这不是我们的 \(\texttt{LGP1631}\) 吗?

不是。因为 \(m\) 可以是 \(O(n^2)\) 的,你不能真的做一遍 \(\texttt{LGP1631}\)。正确的做法是二分这个长度,对于每次二分的值 \(lim\),你用双指针来求有多少 \(\text{dis}(s,x)+\text{dis}(y,t)\le lim\),如果有不少于 \(m+1\) 个,那实际的答案就不大于 \(lim\)

复杂度 \(O(n\log V)\)

代码实现

#include <bits/stdc++.h>
using namespace std;
using namespace obasic;
const int MaxN=1e5+5;
const lolo I=1e9;
lolo N,M,K,S,T,X,Y,Z;
vector<pii> Tr[MaxN];
void addudge(int u,int v,int w){Tr[u].push_back({v,w});Tr[v].push_back({u,w});
}
lolo sdis[MaxN],tdis[MaxN];
void dfs(int u,int f,lolo dis[]){for(auto [v,w] : Tr[u])if(v!=f)dis[v]=dis[u]+w,dfs(v,u,dis);}
pli sdp[MaxN],tdp[MaxN];
bool check(lolo lim){lolo cnt=0;for(int p=1,q=N;p<=N;p++){auto [ppw,ppu]=sdp[p];for(;q&&ppw+tdp[q].first>lim;q--);cnt+=q;for(auto [v,w] : Tr[ppu])if(tdis[v]+ppw<=lim)cnt--;}return cnt>M;
}
lolo ans;
int main(){readis(N,M,K,S,T);for(int i=1;i<N;i++)readis(X,Y,Z),addudge(X,Y,Z);dfs(S,0,sdis),dfs(T,0,tdis);ans=sdis[T];if(!M){minner(ans,K),writi(ans);return 0;}minner(ans,I);if(M>=(N-1)*(N-1)){writi(ans);return 0;}for(int i=1;i<=N;i++)sdp[i]={sdis[i],i},tdp[i]={tdis[i],i};sort(sdp+1,sdp+N+1),sort(tdp+1,tdp+N+1);lolo sl=1,sr=I-1,smid,sres=I;while(sl<=sr){smid=(sl+sr)>>1;if(check(smid))sres=smid,sr=smid-1;else sl=smid+1;}minner(ans,sres+K);writi(ans);return 0;
}

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

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

相关文章

网课三

网课三4-Melplotlib 导入相关包:import matplotlib.pyplot as plt 线图:plot():变化趋势 散点图:scatter():数据的相关性 条形图:bar():数据大小和变化趋势 饼图:pie():部分在总体的占百分比 直方图和密度图:hist(…

解决Pregenerating ConTeXt MarkIV format. This may take some time...卡死问题

1、情况 使用apt安装某个软件包在解压时导致卡死,一开始以为多等一会就好了,结果等了好久还是不行,查看资源占用发现cpu占用率很低、磁盘IO也没有、网络也没动静,感觉就是卡死了2、解决方法 上网一查,发现好多人也…

日期相关函数、方法

2025.10.15 1.select * from BORROW where datediff(dd,RDATE,getdate())=0DATEDIFF(datepart, startdate, enddate) 函数返回两个日期之间的时间。 若只需要比较日期,要用datediff检查日期(dd)差,为0 则为当天。…

“[GESP202509 五级] 有趣的数字和”分块做法

这个题看到第一眼不是暴力数位 dp 创过去吗? 换以前,我虽然忘了数位 dp ,但是可能接着这个机会重新学一遍数位 dp 。 但是最近工作任务和学校任务都很重,根本不想重新学一遍数位 DP 。 反而让我发现了一个更通用更…

精确率

2025.10.15 1.精确率是指正确预测的正样本数与所有预测为正样本的比率,反映了模型预测为正样本的准确性

FBAM 论文浅析

这篇论文对当前以Transformer为主流的大模型基础架构提出了深刻的反思与挑战。它论证了纯粹并行化的模型在理论上存在表达能力的上限,并提出了一种融合并行与递归优势的新架构——帧动作模型(Frame-based Action Mod…

2025年上海律师服务最新权威推荐榜:经侦律师,民事纠纷律师,刑事律师,经济律师,婚姻律师,法务律师,负债律师事务所专业实力与口碑深度解析

2025年上海律师服务最新权威推荐榜:经侦律师,民事纠纷律师,刑事律师,经济律师,婚姻律师,法务律师,负债律师事务所专业实力与口碑深度解析在当今复杂多变的法律环境中,上海作为中国的经济与金融中心,对专业法律…

2025年冲压件厂家最新权威推荐榜:新能源/光伏/精密/异形/五金/铝/汽配/不锈钢/家具冲压件优质供应商精选

2025年冲压件厂家最新权威推荐榜:新能源/光伏/精密/异形/五金/铝/汽配/不锈钢/家具冲压件优质供应商精选行业背景与发展趋势冲压加工作为现代制造业的基础工艺,在新能源、光伏、汽车、家具等领域的应用日益广泛。随着…

前端知识图谱

一、JavaScript基础 变量和类型 ● 1.JavaScript规定了几种语言类型 ● 2.JavaScript对象的底层数据结构是什么 ● 3.Symbol类型在实际开发中的应用、可手动实现一个简单的Symbol ● 4.JavaScript中的变量在内存中的具…

软考二

软考二Posted on 2025-10-15 00:41 心默默言 阅读(0) 评论(0) 收藏 举报1. 基本概念与算法1.1 数据元素与数据项1.2 数据结构1.3 算法

UVa(紫书)做题记录

第八章:高效算法设计 UVA11093 Just Finish it up 最直接的办法:选取正收益的点开始,O(n) judge。但有个必须注意到的性质,即如果一个起点不合法,那么刚才扫过的所有点不不合法。于是时间复杂度就降下来了。明明就…

MyBatis 延迟加载使用及原理 - Higurashi

一、延迟加载是什么? 延迟加载(Lazy Loading)又称“惰性加载”,指的是:当查询一个对象时,不立即加载它的关联对象(如一对多、多对一关系),而是在第一次真正使用该关联对象时才去执行 SQL 查询加载它。举个例子…

ADC-过零检测详解

转载自:https://mbb.eet-china.com/tech/t1/177081.html1、反电动势波形的起源 下图展示了内转子磁极的磁感应强度B的分布情况。定义磁感应强度方向向外为正 在0的时候,处于正反方向交界处,磁感应强度为零; 然后开…

今日小雨

喜欢泥土的香气 傍晚的微风 夹杂着清新与沉闷之感 不必要的话不说 有些话没必要说 所做的目的懒得过问 回避过问 大觉一场

内网穿透进阶:让 frpc 只代理「真正在线」的端口

一条脚本搞定「端口探活 + 配置热更新 + 服务保活」,彻底告别手动重启与爆炸日志。一、痛点:静态配置的尴尬本地服务没启动,frpc 仍疯狂重试,日志秒级刷屏;新增/下线服务要手动改 TOML → 重启,极易遗忘;服务异…

规则逻辑与人文逻辑的统一:AI元人文构想的演进之路

规则逻辑与人文逻辑的统一:AI元人文构想的演进之路 在人工智能发展的关键转折点,我们面临着深刻的认知跃迁:规则逻辑与人文逻辑并非对立的两极,而是智能进化道路上相互依存、彼此成就的必然维度。AI元人文构想以其…

2023 ICPC Jinan

2023 ICPC Jinan ICPC Jinan G 考虑找矛盾。首先对于同一行,翻转和不翻是一个矛盾,对于相异的行,若一行的翻转或不反转会使同一列产生多余的 1,则又是一个矛盾。将每一行拆成两个点,一个点代表不翻转该行,一个点…

二叉树中和为目标值的路径

LCR 153. 二叉树中和为目标值的路径 LCR 153. 二叉树中和为目标值的路径参考题解前言 该题考察二叉树中的回溯,使用先序遍历以及路径记录 先序遍历:根左右 路径记录:通过一个“中间人”(path)来记录当前的路径和,…

动态库的调用方式

在 Linux 中,动态库(.so文件)的调用方式主要有两种:编译时链接(隐式调用)和运行时加载(显式调用)。 一、编译时链接(隐式调用) 这种方式在编译阶段就指定动态库,程序启动时会自动加载依赖的动态库,适用于已…

动态库的调用方式

在 Linux 中,动态库(.so文件)的调用方式主要有两种:编译时链接(隐式调用)和运行时加载(显式调用)。 一、编译时链接(隐式调用) 这种方式在编译阶段就指定动态库,程序启动时会自动加载依赖的动态库,适用于已…