[Luogu] 运输计划
https://www.luogu.org/problemnew/show/2680
inline 神奇的东西
最好戒掉吧(read()除外)
这道题将求解性问题转化为判定性问题,当然就是二分答案了
二分删掉边后最短路径的最大值 mid
将所有的比mid大的询问求交集:树上差分,cnt[s] ++, cnt[t] ++, cnt[lca(s, t)] -= 2
最后统计每个节点以及该节点的子树的cnt的和,若
和==比mid大的询问数量,则说明该点与其父亲组成
的这条边在所有边的交集上
判断 :最大路径-最大的交集中的边
#include <bits/stdc++.h> using namespace std;
const int N = 3e5 + ; #define gc getchar() int Cnt[N], tree[N], fa[N], siz[N], son[N], topp[N], deep[N], head[N];
int n, m, now = , tim;
int L[N], R[N], D[N], dis[N];
int LCA[N];
struct Node {int u, v, w, nxt;} G[N << ];
int js; inline int read(){
int x = ; char c = gc;
while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x;
} void add(int u, int v, int w){
G[now].u = u; G[now].v = v; G[now].w = w; G[now].nxt = head[u]; head[u] = now ++;
} void dfs_find_son(int u, int f_, int dep){
fa[u] = f_; deep[u] = dep; siz[u] = ;
for(int i = head[u]; ~ i; i = G[i].nxt){
int v = G[i].v;
if(v != f_){
dis[v] = dis[u] + G[i].w;
dfs_find_son(v, u, dep + );
siz[u] += siz[v];
if(siz[v] > siz[son[u]]) son[u] = v;
}
}
} void dfs_to_un(int u, int tp){
topp[u] = tp;
tree[u] = ++ tim;
if(!son[u]) return ;
dfs_to_un(son[u], tp);
for(int i = head[u]; ~ i; i = G[i].nxt){
int v = G[i].v;
if(v != son[u] && v != fa[u]) dfs_to_un(v, v);
}
} int Lca(int x, int y){
int tp1 = topp[x], tp2 = topp[y];
while(tp1 != tp2){
if(deep[tp1] < deep[tp2]) swap(x, y), swap(tp1, tp2);
x = fa[tp1];
tp1 = topp[x];
}
return deep[x] > deep[y] ? y : x;
} void Calc(int u){
if(!son[u]) return ;
for(int i = head[u]; ~ i; i = G[i].nxt){
int v = G[i].v;
if(v != fa[u]){
Calc(v);
Cnt[u] += Cnt[v];
}
}
} bool See(int x){
for(int i = ; i <= n; i ++) Cnt[i] = ;
int B(); int Max_dis = -, Max_w = -;
for(int i = ; i <= m; i ++)
if(D[i] > x) Max_dis = max(Max_dis, D[i]), B ++, Cnt[L[i]] ++, Cnt[R[i]] ++, Cnt[LCA[i]] -= ;
Calc();
for(int i = ; i <= n; i ++) if(Cnt[i] == B) Max_w = max(Max_w, dis[i] - dis[fa[i]]);
return Max_dis - Max_w <= x ? : ;
} int main()
{
n = read(); m = read();
int l = , r = , ans;
for(int i = ; i <= n; i ++) head[i] = -;
for(int i = ; i < n; i ++){
int u = read(), v = read(), w = read();
add(u, v, w); add(v, u, w);
}
dfs_find_son(, , );
dfs_to_un(, );
for(int i = ; i <= m; i ++){
L[i] = read(); R[i] = read();
LCA[i] = Lca(L[i], R[i]);
D[i] = dis[L[i]] + dis[R[i]] - (dis[LCA[i]] * );
r = max(r, D[i]);
} while(l <= r){
int mid = (l + r) >> ;
if(See(mid)) ans = mid, r = mid - ;
else l = mid + ;
}
printf("%d", ans);
return ;
}
/*
6 3
1 2 3
1 6 4
3 1 7
4 3 6
3 5 5
3 6
2 5
4 5
*/
[Luogu] 运输计划的更多相关文章
- Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)
Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...
- [luogu]P2680 运输计划[二分答案][树上差分]
[luogu]P2680 [NOIP2015]运输计划 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n ...
- luogu P2680 运输计划 (二分答案+树上差分)
题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间 ...
- Luogu P2680 运输计划(二分+树上差分)
P2680 运输计划 题意 题目背景 公元\(2044\)年,人类进入了宇宙纪元. 题目描述 公元\(2044\)年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道 ...
- P2680 运输计划
http://www.luogu.org/problem/show?pid=2680#sub 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航 ...
- [noip 2015]运输计划 [LCA][树链剖分]
用了luogu上的题目描述 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的 ...
- 【NOIP2015提高组】运输计划
https://daniu.luogu.org/problem/show?pid=2680 使完成所有运输计划的时间最短,也就是使时间最长的运输计划耗时最短.最大值最小问题考虑用二分答案,每次chec ...
- 洛谷——P2680 运输计划
https://www.luogu.org/problem/show?pid=2680 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每 ...
- [NOIP2015]运输计划 线段树or差分二分
目录 [NOIP2015]运输计划 链接 思路1 暴力数据结构 思路2 二分树上差分 总的 代码1 代码2 [NOIP2015]运输计划 链接 luogu 好久没写博客了,水一篇波. 思路1 暴力数据 ...
随机推荐
- C/C++中内存泄漏、内存溢出与野指针的解释与说明
1.内存泄漏 内存泄漏是指我们在堆中申请(new/malloc)了一块内存,但是没有去手动的释放(delete/free)内存,导致指针已经消失,而指针指向的东西还在,已经不能控制这块内存, 所以就是 ...
- beego入门笔记
Beego Learn Note 示例环境在Deepin系统下. deepin 15.9.3 ├── Beego : 1.11.2 ├── GoVersion : go1.12.4 ├── GOOS ...
- maven配置阿里镜像
在conf\settings.xml 在<mirrors>里面添加 <mirror> <id>nexus-aliyun</id> < ...
- 偶数矩阵 Even Parity,UVa 11464
题目描述 Description 给你一个n*n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上.下.左.右的元素(如果存在的话)之和均为偶数.如图所示的矩阵至少要把3个 ...
- 怎样修改vim的缩进
默认vim的tab缩进是八个空格, 太长了, 需要改短一点. 第一步: 找到vimrc文件所在位置 # find / -name vimrc 第二步: 找到以后用vim打开vimrc文件并增加下面两行 ...
- Linux文件属性整理
Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限.为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定.在Linux中我们可以 ...
- 3_PHP表达式_5_数据类型转换_类型自动转换
以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. PHP类型转换分为类型自动转换和类型强制转换. 1.布尔型数据参与算数运算时,TRUE被转换为整数1,FALSE被 ...
- vscode教程(基础篇)
转载:https://segmentfault.com/a/1190000017949680 本文主要介绍vscode在工作中常用的快捷键及插件,目标在于提高工作效率 本文的快捷键是基于mac的,wi ...
- SAP Cloud for Customer的Container应用设计原理
来自Jerry的同事,Yang Joey. 相信大部分C4C的UI developer包括我刚开始的时候都会比较好奇我们平时写的javascript代码是如何运行在移动设备上的,同样的,我也对这个问题 ...
- 解决 google 浏览器记住密码导致输入框样式改变(变成淡黄色背景)
直接在页面上使用css代码: input:-webkit-autofill , textarea:-webkit-autofill, select:-webkit-autofill { -webkit ...