当前位置: 首页 > news >正文

P2680 [NOIP 2015 提高组] 运输计划

P2680 [NOIP 2015 提高组] 运输计划

大意

给你一棵树,一堆航线,航线之间有边权,让你输出最晚的航线最快啥时候到。

思路

首先就是最大值最小,我们可以考虑进行二分,二分答案 \(k\),也就是说当前的所有航线的路程需要小于等于 \(k\),我们知道,每次改完,最多能让一个航线的值减去 \(1\),我们只需要判断这些大于等于 \(k\) 的航线交集最多的那条边即可。

于是我们的思路就出来了,二分 \(k\),找交集最大的边,判断是否合法。

然后找交集的过程我们可以采用树上差分。

代码

#include<iostream>
#include<algorithm>
using namespace std;const int MAXN = 600005;
const int LOG = 19;int n, m;struct node{int to, nxt, len;
}e[MAXN];
int tot = 0, h[MAXN], dep[MAXN];
int d[MAXN], f[MAXN][LOG];
int sum[MAXN];
struct N{int u, v, val, lca;
}p[MAXN];
void add(int x, int y, int len){e[++ tot] = {y, h[x], len};h[x] = tot;
}void dfs(int u, int fa){dep[u] = dep[fa] + 1;f[u][0] = fa;for(int i = h[u];i;i = e[i].nxt){int v = e[i].to;if(v == fa) continue;sum[v] = sum[u] + e[i].len;dfs(v, u);}
}void I_nt(){for(int k = 1;k < LOG;k ++){for(int i = 1;i <= n;i ++){f[i][k] = f[f[i][k - 1]][k - 1];}}
}int LCA(int u, int v){if(dep[u] < dep[v]) swap(u, v);for(int k = LOG - 1;k >= 0;k --){if(dep[f[u][k]] >= dep[v]){u = f[u][k];}}if(u == v) return u;for(int k = LOG - 1;k >= 0;k --){if(f[u][k] != f[v][k]){u = f[u][k];v = f[v][k];}}return f[u][0];
}int tmp, ans;void dfs2(int u, int fa){for(int i = h[u];i;i = e[i].nxt){int v = e[i].to;if(v == fa) continue;dfs2(v, u);d[u] += d[v];}if(d[u] == tmp){ans = max(ans, sum[u] - sum[f[u][0]]);}
}bool check(int mid){for(int i = 1;i <= n;i ++) d[i] = 0;tmp = 0;for(int i = 1;i <= m;i ++){if(p[i].val > mid){tmp ++;d[p[i].u] ++;d[p[i].v] ++;d[p[i].lca] -= 2;}else break;}ans = -1e9;dfs2(1, 0);if(p[1].val - ans > mid){return false;}return true;
}int main(){ios::sync_with_stdio(0);cin.tie(0);cin >> n >> m;for(int i = 1;i < n;i ++){int u, v, w; cin >> u >> v >> w;add(u, v, w), add(v, u, w);}dfs(1, 0);I_nt();int l = 0, r = 0;for(int i = 1;i <= m;i ++){cin >> p[i].u >> p[i].v;p[i].lca = LCA(p[i].u, p[i].v);p[i].val = (sum[p[i].u] + sum[p[i].v] - 2 * sum[p[i].lca]);r = max(r, p[i].val);}sort(p + 1, p + m + 1, [](N a, N b){return a.val > b.val;});while(l <= r){int mid = (l & r) + ((l ^ r) >> 1);if(check(mid)){//mid is okr = mid - 1;}else{l = mid + 1;}}cout << l << '\n';return 0;
}
http://www.jsqmd.com/news/111309/

相关文章:

  • STM32学习笔记CAN
  • 知识城燕窝哪家好:权威TOP5榜单深度解析 - 品牌测评家
  • 【毕业设计】基于springboot+微信小程序的羽球快讯爱好者平台小程序(源码+文档+远程调试,全bao定制等)
  • 静待鱼跃龙门 —— 我是鲤鱼
  • 在线客服插件修改8282端口为8080端口
  • 实用指南:即插即用系列 | TGRS 2025 GST-Net:基于“相对运动模式”与“全局时空融合”的红外小目标检测
  • 【建议收藏】AI大模型应用开发全攻略:Messages、RAG、Agent、ReAct等核心技术深度解析
  • Seekdb试用心得
  • 《创业之路》-742-技术创业者面临哪些问题?
  • 26、SVG 样式设计全解析
  • 如何为超宽屏显示器选择 KVM 切换器?
  • 工艺过程镜像系统:制造过程的数字孪生
  • Cursor 快捷键全集:提升效率的隐藏秘笈
  • Mathcad的野路子】11kW PFC参数计算书实战拆解
  • 【已解决】PyCharm中使用uv创建项目时Python安装失败的问题
  • 多路定制化电源模块测试解决方案案例-纳米软件
  • 高通跃龙QCS6490平台视频录制与上传(1): 系统环境搭建指南
  • 基于LSTM - AdaBoost的多输入单输出回归预测
  • 在家开泰拉瑞亚私服,搭载cpolar让外地朋友也能玩!
  • ate电源测试设备详解-纳米软件
  • 20、WinJS 应用样式与控件风格全解析
  • 光伏并网系统的仿真就像搭积木,每个模块看似独立却又环环相扣。今天咱们直接上手拆解这个光伏三相并网Simulink模型,顺便聊聊那些藏在模块背后的“骚操作
  • 数字化转型中的测试角色
  • 小程序毕设选题推荐:基于微信小程序的智能学习小程序【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Chain33 Orderbook:去中心化订单簿的创新架构与实现
  • 测试流程的标准化与灵活性:在结构与适应之间寻找最优解
  • 21、WinJS 控件样式全解析
  • 基于SSA-LSTM-DCNN的光伏故障诊断:探索更优之路
  • 大模型3年工作经验,为何不如校招的一张白纸?
  • 2025.12.18代码分析