传送门

暴力做法 50 ~ 60

枚举删边,求最大路径长度的最小值。

其中最大路径长度运用到了lca

我们发现,求lca的过程已经不能优化了,那么看看枚举删边的过程能不能优化。

先把边按照权值排序,然后。。。

然而并没有什么卵用。

题解给出了一种二分

二分答案。

判断依据:

比当前答案大的路径长度如果有一个公共边,并且最大的路径减去这条公共边小于等于当前答案,那么当前答案就满足。

如果当前答案不满足,那么比他小的答案更不可能满足,因为都不小于等于当前答案,比当前答案小的更不可能。

接下来就是如何判断,num[i] 表示点 i 指向父亲的边被几条路径所共有。

那么只需要 num[x]++, num[y]++, num[lca(x, y)] -= 2

最后dfs一遍求树上前缀和即可。

然后在 (num[i] == 比当前答案大的边的条数) 中找最大的边

然后判断就可以了

但是就是一个点超时,无语,把倍增改成tarjan也是超时,蛋疼。

——代码

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define max(x, y) ((x) > (y) ? (x) : (y))
#define MAXN 300001 int n, m, cnt, qcnt;
int num[MAXN], dis[MAXN], fv[MAXN], fa[MAXN], f[MAXN];
int head[MAXN], to[MAXN << ], val[MAXN << ], next[MAXN << ], qhead[MAXN], qnext[MAXN << ], qto[MAXN << ];
//int f[MAXN][21], deep[MAXN]; struct node
{
int qx, qy, lca, v;
}q[MAXN]; inline int read()
{
int x = , f = ;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -;
for(; isdigit(ch); ch = getchar()) x = (x << ) + (x << ) + ch - '';
return x * f;
} inline void add(int x, int y, int z)
{
to[cnt] = y;
val[cnt] = z;
next[cnt] = head[x];
head[x] = cnt++;
} inline void addq(int x, int y)
{
qto[qcnt] = y;
qnext[qcnt] = qhead[x];
qhead[x] = qcnt++;
} /*inline void dfs(int u)
{
int i, v;
deep[u] = deep[f[u][0]] + 1;
for(i = 0; f[u][i]; i++) f[u][i + 1] = f[f[u][i]][i];
for(i = head[u]; i ^ -1; i = next[i])
{
v = to[i];
if(!deep[v]) fv[v] = val[i], dis[v] = dis[u] + val[i], f[v][0] = u, dfs(v);
}
} inline int Lca(int x, int y)
{
int i;
if(deep[x] < deep[y]) x ^= y ^= x ^= y;
for(i = 18; i >= 0; i--)
if(deep[f[x][i]] >= deep[y])
x = f[x][i];
if(x == y) return x;
for(i = 18; i >= 0; i--)
if(f[x][i] ^ f[y][i])
x = f[x][i], y = f[y][i];
return f[x][0];
}*/ inline int find(int x)
{
return x == fa[x] ? x : fa[x] = find(fa[x]);
} inline void dfs(int u)
{
int i, v, x;
fa[u] = u;
for(i = head[u]; i ^ -; i = next[i])
{
v = to[i];
if(f[u] ^ v) f[v] = u, dis[v] = dis[u] + val[i], fv[v] = val[i], dfs(v);
}
for(i = qhead[u]; i ^ -; i = qnext[i])
{
v = qto[i];
if(f[x = u ^ q[v].qx ^ q[v].qy] || x == ) q[v].lca = find(x);
}
fa[u] = f[u];
} inline void dfs1(int u)
{
int i, v;
for(i = head[u]; i ^ -; i = next[i])
{
v = to[i];
if(v ^ f[u]) dfs1(v), num[u] += num[v];
}
} inline bool pd(int sum)
{
int i, x = , y = m, mid, ans, value = ;
memset(num, , sizeof(num));
while(x <= y)
{
mid = (x + y) >> ;
if(q[mid].v <= sum) x = mid + ;
else ans = mid, y = mid - ;
}
for(i = ans; i <= m; i++) num[q[i].qx]++, num[q[i].qy]++, num[q[i].lca] -= ;
dfs1();
for(i = ; i <= n; i++)
if(num[i] == m - ans + )
value = max(value, fv[i]);
if(!value) return ;
return q[m].v - value <= sum;
} inline bool cmp(node x, node y)
{
return x.v < y.v;
} int main()
{
int i, x, y, z, mid, ans = ;
n = read();
m = read();
memset(head, -, sizeof(head));
memset(qhead, -, sizeof(qhead));
for(i = ; i < n; i++)
{
x = read();
y = read();
z = read();
add(x, y, z);
add(y, x, z);
}
//dfs(1);
for(i = ; i <= m; i++)
{
q[i].qx = read();
q[i].qy = read();
addq(q[i].qx, i);
addq(q[i].qy, i);
//q[i].lca = Lca(q[i].qx, q[i].qy);
//q[i].v = dis[q[i].qx] + dis[q[i].qy] - (dis[q[i].lca] << 1);
}
dfs();
x = y = ;
for(i = ; i <= m; i++) q[i].v = dis[q[i].qx] + dis[q[i].qy] - (dis[q[i].lca] << ), y = max(y, q[i].v);
std::sort(q + , q + m + , cmp);
while(x <= y)
{
mid = (x + y) >> ;
if(pd(mid)) ans = mid, y = mid - ;
else x = mid + ;
}
printf("%d\n", ans);
return ;
}

还留有倍增的痕迹。

[luoguP2680] 运输计划(lca + 二分 + 差分)的更多相关文章

  1. BZOJ 4326:NOIP2015 运输计划(二分+差分+lca)

    NOIP2015 运输计划Description公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所 ...

  2. [luogu2680] 运输计划 (lca+二分+树上差分)

    传送门 Description Input Output 一个整数,表示小 P 的物流公司完成阶段性工作所需要的最短时间. Sample Input 6 3 1 2 3 1 6 4 3 1 7 4 3 ...

  3. luoguP2680 运输计划 题解(二分答案+树上差分)

    P2680 运输计划  题目 这道题如果是看的我的树上差分来的,那么肯定一看题目就可以想到树上差分. 至于这是怎么想到的,一步一步来: 1.n有300000,不可能暴力枚举每一条边 2.因为我们要使运 ...

  4. NOIP2015 运输计划(二分+LCA+差分)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 308  Solved: 208[Submit][Status] ...

  5. BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 1388  Solved: 860 [Submit][Stat ...

  6. [NOIP2015]运输计划(树上差分+LCA+二分)

    Description 公元 2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球. 小 P 掌管 ...

  7. bzoj4326: NOIP2015 运输计划(二分+LCA+树上差分)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4326 题目大意:有一颗含有n个顶点的树,每两个点之间有一个边权,现在有m个运输计划,每个 ...

  8. 洛谷P2680 运输计划 [LCA,树上差分,二分答案]

    题目传送门 运输计划 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n?1 条双向航道,每条航道建立在两个星球之间, 这 n?1 条航道连通了 L 国的所 ...

  9. LOJ2425 NOIP2015 运输计划 【二分+LCA+树上差分】*

    LOJ2425 NOIP2015 运输计划 LINK 题意:给你一颗树,可以将任意一条边的权值变成0,然后求m条路径的长度的最小值 思路: 先二分最后的距离ans,然后我们把路程大于ans的所有路径拿 ...

  10. BZOJ_4326_[NOIP2015]_运输计划_(二分+LCA_树链剖分/Tarjan+差分)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=4326 给出一棵带有边权的树,以及一系列任务,任务是从树上的u点走到v点,代价为u到v路径上的权 ...

随机推荐

  1. P4110 [HEOI2015]小L的白日梦

    传送门 题解 //minamoto #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef l ...

  2. /usr/lib64/python2.6/lib-dynload/pyexpat.so: symbol XML_SetHashSalt, version EXPAT_2_0_1_RH not defined in file libexpat.so.1 with link time reference

    解决方法:[root]$cd /usr/lib64/python2.6/lib-dynload[root]$ln -s /lib64/libexpat.so.1.5.2 libexpat.so.0[r ...

  3. Java实现日期时间对象的使用

    利用类对象计算日期 在利用Java语言进行信息系统开发中,经常需要对日期进行计算和转换,比如,设置了某活动的开始日期和结束日期,系统需要判断当前是否是该活动时间,在Java开发的信息系统中,通常日期以 ...

  4. [SDOI2010]外星千足虫(高斯消元)

    高斯消元裸题... 方法一:暴力,O(2^n)20分 方法二:直接Gauss,加点玄学技巧搞得好的话70分 方法三:使用bitset优化,复杂度:$O(\frac{n^3}{ω})$ 不会的同学看一下 ...

  5. JavaScript 把函数作为参数进行传值

    JavaScript 响应式编程模式有点类似 WebForm 中的事件驱动模式(传相应的处理函数给委托,通过事件来触发来进行相关的处理),在 AngularJs 2.x 框架中,应用了 RxJS AP ...

  6. myeclipse中js文件报错

    这几天在myeclipse中添加文件时,会报错,但是代码是从官网上下载的,没有错误,只是myeclipse的检查较为严格.在网上找到解决方案,希望可以帮到强迫症的人. 解决步骤: 1.window→P ...

  7. 揭开WebService的神秘面纱

    一.序言 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成分.但是不得不承认的是Web ...

  8. MVC之参数验证(二)

    MVC内部针对这此验证是如何实现的咧???现在我们就来分析一下这此验证的背后故事.... 1.ModelValidator与ModelValidatorProvider 虽然Model绑定方式的因绑定 ...

  9. GDB 使用小结

    GDB 使用小结 Gdb 不用说,两个字,非常强大 >.<,我最讨厌不识数的人了 本文适合GDB 初学和没学过的,如果你懂了,可以相互交流 既然说它很强大,它强大在哪里呢? 一般情况下,大 ...

  10. SugarCRM安装过程——PHP文件上传限制问题

    找到D:\xampp\php目录下,php文件中的php.ini文件,用写字板打开: 1.查找post_max_size,指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值,默认为8M, ...