luogu P2680 运输计划
要最长链的长度最短,一秒想到二分,因为如果对于某个长度满足改掉一边的边权后能使得所有链长度不超过该长度,则所有比他长的长度也满足.
二分最终答案.我们要使得原来长度大于二分的\(mid\)的链删边后小于\(mid\),所以要找出一条最长的,被所有长度大于\(mid\)的链包含的边,使得最长链长度减去这条边长度不超过\(mid\)
用树剖求出\(lca\),用来求每条链的长度.我们还要在check的时候知道每条边被哪些长度大于\(mid\)的链覆盖,使用差分即可
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db double
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int N=300000+10;
il LL rd()
{
re LL x=0,w=1;re char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int to[N<<2],nt[N<<2],w[N<<2],hd[N],tot=1;
il void add(int x,int y,int z)
{
++tot;to[tot]=y;nt[tot]=hd[x];w[tot]=z;hd[x]=tot;
++tot;to[tot]=x;nt[tot]=hd[y];w[tot]=z;hd[y]=tot;
}
int n,sz[N],de[N],hc[N],top[N],dis[N],fae[N],fa[N],a[N],m,q[N][3],len[N],maxl,ma,nm;
il void dfs1(int x,int ffa)
{
sz[x]=1;
for(re int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y==ffa) continue;
dis[y]=dis[x]+w[i],de[y]=de[x]+1,fae[y]=w[i],fa[y]=x;
dfs1(y,x);
sz[x]+=sz[y];
if(sz[y]>sz[hc[x]]) hc[x]=y;
}
}
il void dfs2(int x,int ffa)
{
if(hc[x])
{
top[hc[x]]=top[x];
dfs2(hc[x],x);
}
for(re int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y==ffa||y==hc[x]) continue;
top[y]=y;
dfs2(y,x);
}
}
il void dd(int x,int ffa)
{
for(re int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y==ffa) continue;
dd(y,x);
a[x]+=a[y];
if(a[y]>=nm) ma=max(ma,fae[y]);
}
}
il bool check(int mid)
{
ma=nm=0;
for(re int i=1;i<=n;i++) a[i]=0;
for(re int i=1;i<=m;i++)
if(len[i]>mid) ++a[q[i][0]],++a[q[i][1]],----a[q[i][2]],++nm;
dd(1,0);
return mid>=maxl-ma;
}
int main()
{
n=rd(),m=rd();
for(re int i=1;i<n;i++)
{
int x=rd(),y=rd(),z=rd();
add(x,y,z);
}
de[1]=1,dfs1(1,0),top[1]=1,dfs2(1,0);
for(re int i=1;i<=m;i++)
{
int x=q[i][0]=rd(),y=q[i][1]=rd();
while(top[x]!=top[y])
{
if(de[top[x]]<de[top[y]]) swap(x,y);
len[i]+=dis[x]-dis[top[x]]+fae[top[x]];
x=fa[top[x]];
}
if(de[x]<de[y]) swap(x,y);
len[i]+=dis[x]-dis[y];
q[i][2]=y;
maxl=max(maxl,len[i]);
}
int l=0,r=maxl,mid,ans=maxl;
while(l<=r)
{
mid=(l+r)>>1;
if(check(mid)) r=mid-1,ans=mid;
else l=mid+1;
}
printf("%d\n",ans);
return 0;
}
luogu P2680 运输计划的更多相关文章
- Luogu P2680 运输计划(二分+树上差分)
P2680 运输计划 题意 题目背景 公元\(2044\)年,人类进入了宇宙纪元. 题目描述 公元\(2044\)年,人类进入了宇宙纪元. \(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 运输计划 65分做法
临近\(noip,AK\)不太现实,暴力才是王道,大佬无视 这里只介绍\(65\)分做法 ① \(m==1\) 的情况 很明显 就一条路径,当然要贪心选着一条路径路上的最大的边喽 傻逼分\(get 2 ...
- 洛谷 P2680 运输计划 解题报告
P2680 运输计划 题目背景 公元2044年,人类进入了宇宙纪元. 题目描述 公元2044年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道,每条航道建立在两个星 ...
- 洛谷 P2680 运输计划-二分+树上差分(边权覆盖)
P2680 运输计划 题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条 ...
- P2680 运输计划(二分+树上差分)
P2680 运输计划 链接 分析: 二分+树上差分. 首先可以二分一个答案,那么所有比这个答案大的路径,都需要减去些东西才可以满足这个答案. 那么减去的这条边一定在所有的路径的交集上. 那么如果求快速 ...
- P2680 运输计划
http://www.luogu.org/problem/show?pid=2680#sub 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航 ...
- 洛谷——P2680 运输计划
https://www.luogu.org/problem/show?pid=2680 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每 ...
随机推荐
- js輸出
js訪問html的某個元素,使用document.getElementByID(); document.write()僅僅向文檔輸出內容,如果在頁面已經加載后輸出,原來頁面的內容會被覆蓋. docum ...
- LOJ6387 [THUPC2018] 绿绿与串串 【manacher】
题目分析: 比较简单,先跑一边manacher,然后对于回文部分可以碰到末尾的一定满足条件,否则向后转移. 代码: #include<bits/stdc++.h> using namesp ...
- Educational Codeforces Round 4 C. Replace To Make Regular Bracket Sequence
题目链接:http://codeforces.com/contest/612/problem/C 解题思路: 题意就是要求判断这个序列是否为RBS,每个开都要有一个和它对应的关,如:<()> ...
- MT【9】绝对值二次函数
解答: 评:容易用绝对值不等式证明当$x\in[1,5]$时$|x^2+px+q|\ge2$
- Android GPS定位测试(附效果图)
今天因为工作需要,把以前编写的一个GPS测试程序拿出来重新修改了一下.这个程序说起来有些历史了,是我11年编写的,那时候学了Android开发没多久,算是一个实验性的作品.现在工作需要,重新拿出来修整 ...
- 51nod 1462 树据结构 | 树链剖分 矩阵乘法
题目链接 51nod 1462 题目描述 给一颗以1为根的树. 每个点有两个权值:vi, ti,一开始全部是零. Q次操作: 读入o, u, d o = 1 对u到根上所有点的vi += d o = ...
- centos6.5修改主机名
centos 修改主机名 0.说明 系统安装后,系统默认的主机名称是localhost,现在想要修改为master.操作需要root权限. 1.方案一:仅当前登录有效,重启后失效 直接在命令行执行命令 ...
- [学习笔记]prufer序列
前言 PKUWC和NOIWC都考察了prufer序列,结果统统爆零 prufer序列就是有标号生成树对序列的映射 prufer序列生成 每次选择编号最小的叶子删掉,把叶子的父亲加入prufer序列,直 ...
- win7(旗舰版)下,OleLoadPicture 加载内存中的图片(MagickGetImageBlob),返回值 < 0
昨天去三哥家,想把拍好的照片缩小一下,我用很久前写的一个软件进行缩小,然后进行一次效果预览,这个时候弹出: Call OleLoadPicture Fail - loadPictureFromMW 奇 ...
- javascript面向对象精要第二章函数整理精要