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] 运输计划的更多相关文章

  1. Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)

    Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...

  2. [luogu]P2680 运输计划[二分答案][树上差分]

    [luogu]P2680 [NOIP2015]运输计划 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n ...

  3. luogu P2680 运输计划 (二分答案+树上差分)

    题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间 ...

  4. Luogu P2680 运输计划(二分+树上差分)

    P2680 运输计划 题意 题目背景 公元\(2044\)年,人类进入了宇宙纪元. 题目描述 公元\(2044\)年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道 ...

  5. P2680 运输计划

    http://www.luogu.org/problem/show?pid=2680#sub 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航 ...

  6. [noip 2015]运输计划 [LCA][树链剖分]

    用了luogu上的题目描述 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的 ...

  7. 【NOIP2015提高组】运输计划

    https://daniu.luogu.org/problem/show?pid=2680 使完成所有运输计划的时间最短,也就是使时间最长的运输计划耗时最短.最大值最小问题考虑用二分答案,每次chec ...

  8. 洛谷——P2680 运输计划

    https://www.luogu.org/problem/show?pid=2680 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每 ...

  9. [NOIP2015]运输计划 线段树or差分二分

    目录 [NOIP2015]运输计划 链接 思路1 暴力数据结构 思路2 二分树上差分 总的 代码1 代码2 [NOIP2015]运输计划 链接 luogu 好久没写博客了,水一篇波. 思路1 暴力数据 ...

随机推荐

  1. xorm表结构操作实例

    获取数据库信息 package main import ( "fmt" _ "github.com/go-sql-driver/mysql" "git ...

  2. conda命令入坑记

    conda命令入坑记 本人使用的软件版本: TypeError: LoadLibrary() argument 1 must be str, not None 网上太多的资料,大多都是在讲path的设 ...

  3. fatfs系统的移植

    integer.h   FATFS的数据类型定义(一般不需要更改,其他的文件都需要引用这个文件的内容) ffcon.h FATFS的配置文件,配置项的各个参数都需要在这里修改 一个细致的讲解fatfs ...

  4. jqgrid属性以及事件

    转载 1.属性 参数名称 类型 描述 默认值 是否可以被修改 ajaxGridOptions object 对ajax参数进行全局设置,可以覆盖ajax事件:error,complete 和 befo ...

  5. DG环境恢复同步遇到报错ORA-00353ORA-00334以及ORA-00600[2619], [47745]

    问题说明 客户环境主库4节点RAC11.2.0.4,单实例DG环境,DG由于空间不足,导致同步中断,由于DG备库未应用的归档主库都再,本次恢复的方式,是开启dg mrp进程,自动同步追上主库. 以下遇 ...

  6. axios 内部原理学习记录

    前提:一次面试被问到了,axios有什么特点,对比一下ajax.答的很不满意. axios是一个基于Promise的http请求库,可用于浏览器和 Node.可以说是目前最为常用的http库,有必要了 ...

  7. 【转载】 C#通过File类实现文件拷贝复制的功能

    在Windows系统的使用过程中,一个较常使用的功能就是文件的复制拷贝操作,其实在C#开发中,也可以使用File类库中的Copy方法来实现文件的拷贝,支持设定原文件地址,以及拷贝复制后的文件存放路径. ...

  8. 'vue' 不是内部或外部命令

    运用cnpm淘宝镜像安装vue-cli,然后输入vue,显示“'vue' 不是内部或外部命令”,然后百度查找方法,解决办法如下: 虽然电脑是64位的电脑,然后node我也下载安装的是64位,然后,我重 ...

  9. unity图片保留周边,中间延伸

    1.先把图片切割,类似下面这样的 2.然后在使用的时候(选择图片类型的时候选择sliced)

  10. Haddop完全分布式集群搭建

    hadoop完全分布式搭建 建议(遇到的坑): 如果自己用的操作系统就是linux,我本身是deepin系统,装了两台虚拟机,结果,用户名没有配置,导致启动不了,因为hadoop的master节点启动 ...