二分+LCA+查分前缀和
 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char ch;ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
struct data{int to,next,v,from;}e[];
struct data2{int to,next,from,num;}as[];
int lca[],dis[];
int head[],head2[],cnt;
void add(int u,int v,int w){e[cnt].from=u,e[cnt].to=v,e[cnt].next=head[u],e[cnt].v=w,head[u]=cnt;cnt++;}
void add2(int u,int v,int nu){as[cnt].to=v,as[cnt].next=head2[u],as[cnt].from=u,as[cnt].num=nu,head2[u]=cnt,cnt++;}
int n,m,l=,r=;
int d[];
bool vis[];
int fa[];
int p[];
int s[],t1[];
int find(int x){return x==fa[x]?fa[x]:fa[x]=find(fa[x]);}
int maxn=,maxj=;
void dfs(int now,int d)
{
dis[now]=d;
vis[now]=;
for(int i=head[now];i>=;i=e[i].next) if(!vis[e[i].to]) dfs(e[i].to,d+e[i].v);
}
void Lca(int now)
{
vis[now]=;
for(int i=head[now];i>=;i=e[i].next)
if(!vis[e[i].to])
{
Lca(e[i].to);fa[find(e[i].to)]=find(now);
}
for(int i=head2[now];i>=;i=as[i].next)
{
if(vis[as[i].to])
{
lca[as[i].num]=find(as[i].to);
//cout<<dis[as[i].from]<<' '<<dis[as[i].to]<<' '<<2*dis[lca[as[i].num]]<<endl;
d[as[i].num]=abs(dis[as[i].from]+dis[as[i].to]-*dis[lca[as[i].num]]);
r=max(r,d[as[i].num]);
}
}
}
int work(int now,int t,int from)
{
int sum=p[now];
for(int i=head[now];i>=;i=e[i].next)
if(e[i].to!=from) sum+=work(e[i].to,t,e[i].from);
if(sum==t)maxj=max(maxj,dis[now]-dis[from]);
return sum;
}
bool check(int mid,int t)
{
work(,t,);
if(maxn-maxj<=mid) return ;
else return ;
}
int main()
{
memset(head,-,sizeof(head));
memset(head2,-,sizeof(head2));
n=read(),m=read();
for(int i=;i<=n;i++) fa[i]=i;
for(int i=;i<n;i++)
{
int u,v,w;
u=read(),v=read(),w=read();
add(u,v,w);
add(v,u,w);
}
cnt=;
for(int i=;i<=m;i++)
{
s[i]=read(),t1[i]=read();
add2(s[i],t1[i],i);
add2(t1[i],s[i],i);
}
dfs(,);
memset(vis,,sizeof(vis));
Lca();
//for(int i=1;i<=n;i++) cout<<dis[i]<<endl;
//for(int i=1;i<=m;i++) cout<<d[i]<<endl;
while(l<=r)
{
int t=;
int mid=(l+r)>>;
maxj=;
memset(p,,sizeof(p));
for(int i=;i<=m;i++)
{
if(d[i]>mid){maxn=max(maxn,d[i]);t++;p[s[i]]++,p[t1[i]]++,p[lca[i]]-=;}
}
if(check(mid,t)) r=mid-;
else l=mid+;
}
cout<<l;
return ;
}

noip2015运输计划的更多相关文章

  1. bzoj 4326: NOIP2015 运输计划

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

  2. NOIP2015 运输计划(bzoj4326)

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

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

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

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

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

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

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

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

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

  7. BZOJ 4326 NOIP2015 运输计划 (二分+树上差分)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1930  Solved: 1231[Submit][Statu ...

  8. cogs2109 [NOIP2015] 运输计划

    cogs2109 [NOIP2015] 运输计划 二分答案+树上差分. STO链剖巨佬们我不会(太虚伪了吧 首先二分一个答案,下界为0,上界为max{路径长度}. 然后判断一个答案是否可行,这里用到树 ...

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

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

  10. AC日记——[NOIP2015]运输计划 cogs 2109

    [NOIP2015] 运输计划 思路: 树剖+二分: 代码: #include <cstdio> #include <cstring> #include <iostrea ...

随机推荐

  1. sql 当重复的数据有多条时,保留一条,删除其他重复

    delete from proj_info where   newcode in (select newcode    from proj_info group by newcode      hav ...

  2. phplib template说明

    phplib template phplib有五大功能:将数据库驱动和对数据库操作完全分离:支持session:权限许可:模板:购物 车 说明:1.第一个简单的模板页first.html模板中的{ma ...

  3. IE兼容HTML5

    <!--[if lt IE9]> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js" ...

  4. ActiveRecord 模式杂谈

    ActiveRecord也属于ORM(对象关系映射)层,由Rails最早提出,遵循标准的ORM模型:表映射到记录,记录映射到对象,字段映射到对象属性.配合遵循的命名和配置惯例,能够很大程度的快速实现模 ...

  5. shell脚本实现仅保留某目录下最新的两个文件

    #!/bin/sh export DS_DIR=/home/cxy/test if [ ! -d $DS_DIR ]; then mkdir $DS_DIR else echo "$DS_D ...

  6. STM32的RTC万年历显示问题

    博客整理后写出来的,有点乱,大家见谅! 想让串口输出万年历效果.每次秒刷新一次 结果是串口软件一直输出,看起来很难受 先讲一讲C代码的\r和\n的区别 \r 就是return 回到 本行 行首 这就会 ...

  7. [JS]_proto_和prototype到底有啥区别

    是时候拿出我珍藏多年的这张图了: 首先,要明确几个点: 1.在JS里,万物皆对象.方法(Function)是对象,方法的原型(Function.prototype)是对象.因此,它们都会具有对象共有的 ...

  8. MFC界面更新实现方法

    1.更新窗口 即采用UpdateWindow()函数立即发送WM_PAINT消息更新整个窗口. void CEditTestDlg::OnBnClickedBtnSysUpdate() { CStri ...

  9. 学习下关于ViewStub实例的用法及带Drawable的TextView的妙用

    在项目中,我们可能有多种数据来源比如: 里面有ListView也有当获得数据为空的时候显示的空信息.根据点击的项目还是差事不同,显示的空消息也不同.a.没有收藏的项目,b目前没有收藏的差事. 其实实现 ...

  10. HDU_2043——判断密码是否安全

    Problem Description 网上流传一句话:"常在网上飘啊,哪能不挨刀啊-".其实要想能安安心心地上网其实也不难,学点安全知识就可以.首先,我们就要设置一个安全的密码. ...