P2680

题目的大意就是走完m条路径所需要的最短时间(边权是时间), 其中我们可以把一条边的权值变成0(也就是题目所说的虫洞)。

可以考虑二分答案x,找到一条边,使得所有大于x的路径经过这条边(差分维护),并且路径减去这条边的边权后小等于x,通过这样判定x是否可行。

 1 #include <bits/stdc++.h>
2 #define ll long long
3 using namespace std;
4 const int N = 3e5 + 10;
5 int tot, head[N], to[N << 1], nxt[N << 1], edge[N << 1];
6 int n, m, fa[N][25], dep[N], dis[N], pre[N], num[N];
7 struct node {
8 int x, y, lca;
9 }q[N];
10 void add(int x, int y, int z) {
11 nxt[++ tot] = head[x], head[x] = tot, to[tot] = y, edge[tot] = z;
12 }
13 void dfs(int u, int f) {
14 dep[u] = dep[f] + 1;
15 fa[u][0] = f;
16 for (int i = 1; i <= 20; i ++)
17 fa[u][i] = fa[fa[u][i - 1]][i - 1];
18 for (int i = head[u]; i; i = nxt[i]) {
19 int v = to[i];
20 if (v == f) continue;
21 pre[v] = edge[i];//v所在这条边的边权
22 dis[v] = dis[u] + edge[i];
23 dfs(v, u);
24 }
25 }
26 int getlca(int x, int y) {
27 if (dep[x] < dep[y]) swap(x, y);
28 for (int i = 20; i >= 0; i --) {
29 if (dep[fa[x][i]] >= dep[y]) x = fa[x][i];
30 }
31 if (x == y) return x;
32 for (int i = 20; i >= 0; i --) {
33 if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
34 }
35 return fa[x][0];
36 }
37 int flag, cnt, maxn;
38 int judge(int u, int f, int cnt, int maxn) {//返回子树和
39 int k = num[u];
40 for (int i = head[u]; i; i = nxt[i]) {
41 int v = to[i];
42 if (v == f) continue;
43 k += judge(v, u, cnt, maxn);
44 }
45 if (k >= cnt && pre[u] >= maxn) flag = 1;
46 //所有>mid的边都经过u所在这条边i,且i的权值满足条件
47 return k;
48 }
49 bool check(ll mid) {
50 memset(num, 0, sizeof num);
51 maxn = cnt = flag = 0;
52 for (int i = 1; i <= m; i ++) {
53 int d = dis[q[i].x] + dis[q[i].y] - 2 * dis[q[i].lca];
54 if (d > mid) {
55 num[q[i].x] ++, num[q[i].y] ++, num[q[i].lca] -= 2;
56 cnt ++;
57 maxn = max(maxn, d);
58 }
59 }
60 if (!cnt) return 1; // !!!!!
61 judge(1, 0, cnt, maxn - mid);
62 return flag;
63 }
64 int main() {
65 scanf("%d %d", &n, &m);
66 for (int i = 1; i < n; i ++) {
67 int a, b, c;
68 scanf("%d %d %d", &a, &b, &c);
69 add(a, b, c), add(b, a, c);
70 }
71 dfs(1, 0);
72 for (int i = 1; i <= m; i ++) {
73 scanf("%d %d", &q[i].x, &q[i].y);
74 q[i].lca = getlca(q[i].x, q[i].y);
75 }
76 ll l = 0, r = 300000000;
77 while (l < r) {
78 ll mid = (l + r) >> 1;
79 if (check(mid)) r = mid;
80 else l = mid + 1;
81 }
82 printf("%lld\n", l);
83 return 0;
84 }

P2680 [NOIP2015 提高组] 运输计划 (树上差分-边差分)的更多相关文章

  1. 洛谷 P2680 [NOIP2015 提高组] 运输计划

    链接:P2680 题意: 在树上把一条边边权变为0使得最长给定路径最短 分析: 最大值最小可以想到二分答案,对于每一个mid,寻找所有大于mid的路径,再寻找是否存在一条边使得删去它后大于mid的路径 ...

  2. NOIP2015 提高组] 运输计划

    码农题啊兄弟们. 随便考虑二分一下,然后发现要取一条满足性质的边. 被所有大于\(mid\)的路径都覆盖,取了之后能把他们都弄到小于\(mid\) 那就树上差分再处理一下. 写了\(180h\),老年 ...

  3. [NOIP2015 提高组] 运输计划题解

    题目链接:P2680 [NOIP2015 提高组] 运输计划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 看了好长时间题解才终于懂的,有关lca和二分答案的题解解释的不详细,一时 ...

  4. [NOIP2015提高组]运输计划

    题目:BZOJ4326.洛谷P2680.Vijos P1983.UOJ#150.codevs4632.codevs5440. 题目大意:有一棵带权树,有一些运输计划,第i个运输计划从ai到bi,耗时为 ...

  5. 【数据结构】运输计划 NOIP2015提高组D2T3

    [数据结构]运输计划 NOIP2015提高组D2T3 >>>>题目 [题目描述] 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航 ...

  6. [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告

    [NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...

  7. 【题解】NOIP2015提高组 复赛

    [题解]NOIP2015提高组 复赛 传送门: 神奇的幻方 \([P2615]\) 信息传递 \([P2661]\) 斗地主 \([P2668]\) 跳石头 \([P2678]\) 子串 \([P26 ...

  8. 洛谷 P2678 & [NOIP2015提高组] 跳石头

    题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...

  9. 【二分查找】 跳石头NOIP2015提高组 D2T1

    [二分查找]跳石头NOIP2015提高组 D2T1 >>>>题目 [题目描述] 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石 ...

随机推荐

  1. 第十九天python3 json和messagepack

    json的数据类型官网:https://www.json.org/ 值: 双引号内的字符串,数值,true和false,null,对象,数组:字符串: 双引号内的任意字符的组合,可以有专一字符:数值: ...

  2. 多表查询_练习1&练习2&练习3

    准备表: -- 部门表 CREATE TABLE dept ( id INT PRIMARY KEY PRIMARY KEY, -- 部门id dname VARCHAR(50), -- 部门名称 l ...

  3. Swift高仿iOS网易云音乐Moya+RxSwift+Kingfisher+MVC+MVVM

    效果 列文章目录 因为目录比较多,每次更新这里比较麻烦,所以推荐点击到主页,然后查看iOS Swift云音乐专栏. 目简介 这是一个使用Swift(还有OC版本)语言,从0开发一个iOS平台,接近企业 ...

  4. Visual Studio Code 中文设置教程

    本文仅供学习交流使用,如侵立删!demo下载见文末 Pycharm中文设置教程 1.首先打开VisualStudioCode,点击扩展:extensions. 2.搜索chinese. 3.选择需要的 ...

  5. 关于微信豆苹果(IOS)用户1比10充值方法

    ​ 微信iOS端微信7.0.20版本之后就上线了微信豆功能,相比大家对微信豆已经不陌生了. 微信官方现在给出了微信豆的含义,微信豆是用于支付微信内虚拟物品的道具,支持在视频号中购买虚拟礼物.也可以对公 ...

  6. 万答#14,xtrabackup8.0怎么恢复单表

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 实 ...

  7. Redis 19 整合SpringBoot

    参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 概述 Spri ...

  8. java学习第三天常用类.day11

    工具类如何设计,在开发中有两种设计: 工具方法:静态方法的使用 非静态的方法使用: 使用单列模式,为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 保证在整个应用中某一个类有且只有一个实例(一 ...

  9. virtio_net 设备的队列数问题

    virtio_net设备的其他问题:见 https://www.cnblogs.com/10087622blog/p/15886345.html 一个virtio_net设备在 virtnet_pro ...

  10. 【小白必看】Redis手把手教你从零开始下载到安装,再到配置允许图形化工具远程连接(一)

    一.Redis安装 本文暂时仅介绍Windows环境下Redis的安装. 由于Windows环境下没有.exe安装文件,这里我们使用"曲线救国"的.msi安装包帮助我们一站式解决安 ...