/*
95 最后一个点T了 qian lv ji qiong 了
没学过树剖 听chx听xzc说的神奇的方法 Orz
首先求出每个计划的路径长度 这里写的倍增
然后二分答案
对于每个ans 统计>他的路径条数 tot 并维护最大差值 dec
并且对于每条不合法的路径维护每个点的经过次数
然后枚举点 如果经过次数==tot说明每一条不合法的都经过他
然后尝试把它建成虫洞 如果他对应边的权值>=dec 那么我们删掉它ans就合法了
关键是统计每个点在非法路径中的经过次数 :
维护sum数组 对于每个非法的路径起点a b LCA(a,b)==s sum[a]++ sum[b]++ sum[s]-=2
这样网上更新的话 经过的点的sum值都变成1 祖先s的变成0
这样就实现了sum数组的维护
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define maxn 300100
using namespace std;
int n,m,num,head[maxn],ans,inf;
int fa[maxn][],dep[maxn],dis[maxn],sum[maxn],edge[maxn];
struct node
{
int u,v,t,pre;
}e[maxn*];
struct Ans
{
int ai,bi,anc,di;
}lca[maxn];
int init()
{
int x=;char s=getchar();
while(s<''||s>'')s=getchar();
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x;
}
void Add(int from,int to,int dis)
{
num++;
e[num].u=from;
e[num].v=to;
e[num].t=dis;
e[num].pre=head[from];
head[from]=num;
}
void Dfs(int now,int from,int c,int Dis)
{
fa[now][]=from;
dep[now]=c;dis[now]=Dis;
for(int i=head[now];i;i=e[i].pre)
if(e[i].v!=from)
{
edge[e[i].v]=i;
Dfs(e[i].v,now,c+,Dis+e[i].t);
}
}
void Get_fa()
{
for(int j=;j<=;j++)
for(int i=;i<=n;i++)
fa[i][j]=fa[fa[i][j-]][j-];
}
int Get_same(int a,int t)
{
for(int i=;i<;i++)
if(t&(<<i)) a=fa[a][i];
return a;
}
int LCA(int a,int b)
{
if(dep[a]<dep[b])swap(a,b);
a=Get_same(a,dep[a]-dep[b]);
if(a==b)return a;
for(int i=;i>=;i--)
if(fa[a][i]!=fa[b][i])
{
a=fa[a][i];
b=fa[b][i];
}
return fa[a][];
}
void Init()
{
n=init();m=init();
int u,v,t;
for(int i=;i<=n-;i++)
{
u=init();v=init();t=init();
Add(u,v,t);Add(v,u,t);
}
Dfs(,,,);
Get_fa();
for(int i=;i<=m;i++)
{
lca[i].ai=init();lca[i].bi=init();
lca[i].anc=LCA(lca[i].ai,lca[i].bi);
lca[i].di=dis[lca[i].ai]+dis[lca[i].bi]-*dis[lca[i].anc];
inf=max(inf,lca[i].di);
}
}
void Up_sum(int now,int from)
{
for(int i=head[now];i;i=e[i].pre)
if(e[i].v!=from)
{
Up_sum(e[i].v,now);
sum[now]+=sum[e[i].v];
}
}
int Judge(int x)
{
memset(sum,,sizeof(sum));
int tot=,dec=;
for(int i=;i<=m;i++)
if(lca[i].di>x)//非法路径
{
tot++;
dec=max(dec,lca[i].di-x);//最长非法路径与ans差值
sum[lca[i].ai]++;
sum[lca[i].bi]++;
sum[lca[i].anc]-=;
}
Up_sum(,);//更新sum数组
for(int i=;i<=n;i++)
if(tot==sum[i]&&e[edge[i]].t>=dec)//删掉edge[i]这条边之后答案合法了
return ;
return ;
}
void Solve()//二分答案
{
int l=,r=inf;
while(l<=r)
{
int mid=(l+r)/;
int tmp=Judge(mid);
if(tmp==)
{
r=mid-;
ans=mid;
}
else l=mid+;
}
}
void Printf()
{
printf("%d\n",ans);
}
int main()
{
//freopen("transport.in","r",stdin);
//freopen("transport.out","w",stdout);
Init();
Solve();
Printf();
return ;
}

noip 2015 运输计划 (lca+二分)的更多相关文章

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

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

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

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

  3. cogs 2109. [NOIP 2015] 运输计划 提高组Day2T3 树链剖分求LCA 二分答案 差分

    2109. [NOIP 2015] 运输计划 ★★★☆   输入文件:transport.in   输出文件:transport.out   简单对比时间限制:3 s   内存限制:256 MB [题 ...

  4. [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告

    [NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...

  5. 4632 NOIP[2015] 运输计划

    4632 NOIP[2015] 运输计划  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 大师 Master 题解       题目描述 Description 公元 2044 ...

  6. NOIP 2015运输计划

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

  7. NOIP[2015] 运输计划(codevs 4632)

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

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

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

  9. NOIP[2015] 运输计划

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

随机推荐

  1. MVC身份验证及权限管理

    MVC自带的ActionFilter 在Asp.Net WebForm的中要做到身份认证微软为我们提供了三种方式,其中最常用的就是我们的Form认证,需要配置相应的信息.例如下面的配置信息: < ...

  2. MVC---Case 1

    <!DOCTYPE html> <html lang="en"> <head> <title>Backbone.js, Requir ...

  3. codeforces C. Sereja and Swaps

    http://codeforces.com/contest/426/problem/C 题意:找出连续序列的和的最大值,可以允许交换k次任意位置的两个数. 思路:枚举区间,依次把区间内的比较小的数换成 ...

  4. Strust2的json插件

    以下这段摘自网上: Json是一种轻量级的数据交换格式,JSon插件提供了一种名为json的ActionResultType .一旦为Action指定了该结果处理类型,JSON插件就会自动将Actio ...

  5. swiper 多个循环的实现

    swiper 最好要一一对应,最好与id关联. new Swiper('#guess .swiper-container', { pagination: '#guess .swiper-paginat ...

  6. Wall(Graham算法)

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 27110   Accepted: 9045 Description Once ...

  7. 数学(FFT):BZOJ 3527 [Zjoi2014]力

    题目在这里:http://wenku.baidu.com/link?url=X4j8NM14MMYo8Q7uPE7-7GjO2_TXnMFA2azEbBh4pDf7HCENM3-hPEl4mzoe2w ...

  8. CodeForces 595A

    题目链接: http://codeforces.com/problemset/problem/595/A 题意: 一栋楼,有n层,每层有m户,每户有2个窗户,问这栋楼还有多少户没有睡觉(只要一个窗户灯 ...

  9. NOI题库1799 最短前缀

    1799:最短前缀 总时间限制: 1000ms 内存限制: 65536kB 描述 一个字符串的前缀是从该字符串的第一个字符起始的一个子串.例如 "carbon"的字串是: &quo ...

  10. 从cpu加电到加载OS内核的详细过程(清华大学ucore-lab1总结一)

    结合最近学习清华的OS课,先用“人话”来高度抽象的描述一下我自己的理解.CPU在系统加电也就是我们按下电源开关后,开始初始化他的寄存器,主要是cs和eip(本文基于x86架构),然后在ROM中找到一个 ...