题目:https://www.luogu.org/problemnew/show/P2680

因为是最长的时间最短,所以二分!

离线LCA可以知道路径长度。每次只看超过二分值的路径。

原本的想法是遍历一下每条超过二分值的路径,找出“去掉它就能使该路径合法”的那些边,打上标记,最后找到有k个标记的边就能行。

但有点不合适。不需要找出“……”的那些边,而把所有该路径上的边都打上标记,最后找到有k个标记的边的时候判断一下去掉它能不能行。

  这样就像均摊了复杂度一样。反正最后都得遍历树,可以那时多做一点、之前少做一点,使时间更好。

注意给边打标记是把它落在它下面的那个点上。而且是LCA的地方-2,和给点打标记不同。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int N=3e5+;
int n,m,head[N],xnt,cs[N],bh[N],l,r,mx,fa[N],hd[N],xt,dis[N],nw,mid,ans;
bool vis[N],flag;
struct Ques{
int dis,x,y,lca;
}a[N];
struct Edge{
int next,to,w;
Edge(int n=,int t=,int w=):next(n),to(t),w(w) {}
}edge[N<<],ed[N<<];
void add(int x,int y,int z)
{
edge[++xnt]=Edge(head[x],y,z);head[x]=xnt;
edge[++xnt]=Edge(head[y],x,z);head[y]=xnt;
}
void ad(int x,int y,int z)
{
ed[++xt]=Edge(hd[x],y,z);hd[x]=xt;
ed[++xt]=Edge(hd[y],x,z);hd[y]=xt;
}
int find(int a){return fa[a]==a?a:fa[a]=find(fa[a]);}
bool cmp(Ques a,Ques b){return a.dis>b.dis;}
void tarjan(int cr,int f)
{
vis[cr]=;
for(int i=hd[cr],v;i;i=ed[i].next)
if(vis[v=ed[i].to])
{
int k=ed[i].w,lc=find(v);
a[k].lca=lc;a[k].dis=dis[cr]+dis[v]-*dis[lc];
mx=max(mx,a[k].dis);
}
for(int i=head[cr],v;i;i=edge[i].next)
if((v=edge[i].to)!=f)
{
bh[v]=i;
dis[v]=dis[cr]+edge[i].w;
tarjan(v,cr);fa[v]=cr;
}
}
void solve(int cr)
{
cs[a[cr].x]++;cs[a[cr].y]++;cs[a[cr].lca]-=;
}
int dfs(int cr,int f)
{
int ret=cs[cr];
for(int i=head[cr],v;i;i=edge[i].next)
if((v=edge[i].to)!=f)
{
ret+=dfs(v,cr);if(flag)return ;
}
if(ret==nw&&mx-edge[bh[cr]].w<=mid)flag=;
return ret;
}
int main()
{
scanf("%d%d",&n,&m);int x,y,z;
for(int i=;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);add(x,y,z);
fa[i]=i;
}
fa[n]=n;
for(int i=;i<=m;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);ad(a[i].x,a[i].y,i);
}
tarjan(,);sort(a+,a+m+,cmp);r=mx;
while(l<=r)
{
mid=((l+r)>>);memset(cs,,sizeof cs);
for(nw=;nw<=m&&a[nw].dis>mid;nw++)solve(nw);
nw--;flag=;dfs(,);
if(flag)ans=mid,r=mid-;
else l=mid+;
}
printf("%d",ans);
return ;
}

洛谷 2680 (NOIp2015) 运输计划的更多相关文章

  1. NOIP2015 D2T3 洛谷2680 BZOJ4326 运输计划 解题报告

    前言:个人认为这是历年NOIP中比较简单的最后一题了,因此将自己的思路与大家分享. 题目大意: 给一棵无根树,给出m条路径.允许将树上的一条边的权值改为0.求m条路径长度最大值的最小值.n,m< ...

  2. 【洛谷P2680】运输计划

    题目链接 题目大意: 一棵\(n\)个点的带边权的数,给定\(m\)条树上两点间的路径,现在你可以让树上任意一条边的权值变为零, 问如何选边使得\(m\)条路径中边权和最大的路径的边权和最小 \(\m ...

  3. bzoj 4326: NOIP2015 运输计划

    4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MB Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个 ...

  4. NOIP2015 运输计划(bzoj4326)

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

  5. [BZOJ4326][codevs4632][codevs5440][UOJ#150][NOIP2015]运输计划

    [BZOJ4326][codevs4632][codevs5440][UOJ#150][NOIP2015]运输计划 试题描述 公元 2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n− ...

  6. [NOIP2015]运输计划 D2 T3 LCA+二分答案+差分数组

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

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

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

  8. 数据结构(树链剖分):COGS 2109. [NOIP2015] 运输计划

    2109. [NOIP2015] 运输计划 ★★★   输入文件:transport.in   输出文件:transport.out   简单对比时间限制:1 s   内存限制:256 MB [题目描 ...

  9. 洛谷 P1967 货车运输

    洛谷 P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在 ...

随机推荐

  1. 解析Linux系统的平均负载概念

    一.什么是系统平均负载(Load average)? 在Linux系统中,uptime.w.top等命令都会有系统平均负载load average的输出,那么什么是系统平均负载呢?系统平均负载被定义为 ...

  2. redis通过命令批量删除key

    需求:想删除 notify_ 开头的所有key redis-cli KEYS "notify_*" | xargs redis-cli DEL 通过 notify_* 来匹配

  3. canal入门使用

    1.下载canal安装包: 地址:https://github.com/alibaba/canal/releases 图例: 2.将下载好的安装包复制到Linux,解压 3.修改配置文件 vi con ...

  4. java类敏感词过滤类

    package com.fpx.pcs.prealert.process.service.impl; import java.util.HashMap;import java.util.HashSet ...

  5. JQuery -- 介绍,选择器及其示例, 基本选择器,层次选择器,过滤选择器,表单选择器

    1. 什么是jQuery对象 jQuery 对象就是通过jQuery包装DOM对象后产生的对象. jQuery对象是jQuery独有的.如果一个对象是jQuery对象,那么它就可以使用jQuery里的 ...

  6. Ubuntu 配置静态ip的方法

    1. 配置静态ip地址 $sudo vi /etc/network/interfaces 原有内容只有如下两行: auto lo iface lo inet loopback 向末尾追加以下内容: a ...

  7. Pro C/C++环境搭建

    一. 安装oracle软件或者oracle客户端. 二. 载入orasql10.lib (1)在连接器->常规->附件库目录中,加入orasql10.lib库所在目录. (2)在连接器-& ...

  8. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)-mysql.sock丢失解决方案

    我们的LAMP是搭建在UBUNTU 12.04 LTS上的. LAMP是通过编译的方式进来安装的. 在一次处理意外挂机时由于未知的原因在重启后发现无法连接数据库了, 在打开网站时出现如下的的提示: E ...

  9. NHibernate的几种查询方式

    SQL:普通SQL查询(也就是SQLServer,Oracle,Sybase等数据库的查询语句,建议使用基于TSQL-92) 核心对象:CreateSQLQuery IList list = sess ...

  10. 剑指offer--36.整数中1出现的次数(从1到n整数中1出现的次数)

    暴力挨个数 ---------------------------------------------------------------------- 时间限制:1秒 空间限制:32768K 热度指 ...