记录编号 |
414832 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[NOIP 2015]运输计划 |
最终得分 |
100 |
用户昵称 |
Hzoi_Maple |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.474 s |
提交时间 |
2017-06-15 09:39:23 |
内存使用 |
28.92 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,x,y,z,maxn,num;
int adj[300001],fr[300001],to[300001];
int dis[300001];
struct kk{
int s,t,w,next;
}k[600001];
int read(){
int sum=0;
char ch=getchar();
while(ch<'0'||ch>'9')
ch=getchar();
while(ch>='0'&&ch<='9'){
sum=sum*10+ch-'0';
ch=getchar();
}
return sum;
}
int swap(int &x,int &y){
x^=y;
y^=x;
x^=y;
}
void init(int s,int t,int w){
k[num].s=s;
k[num].t=t;
k[num].w=w;
k[num].next=adj[s];
adj[s]=num++;
}
int fa[300001],son[300001],size[300001],dp[300001];
int v[300001];
void Dfs1(int x){
son[x]=0;size[x]=1;
for(int i=adj[x];i!=-1;i=k[i].next){
int o=k[i].t,w=k[i].w;
if(o!=fa[x]){
dp[o]=dp[x]+1;
fa[o]=x;v[o]=w;
Dfs1(o);
size[x]+=size[o];
if(size[son[x]]<size[o])
son[x]=o;
}
}
}
int top[300001],id[300001],pos[300001],cnt;
void Dfs2(int u,int tp){
top[u]=tp;id[u]=++cnt;
pos[cnt]=u;
if(son[u])
Dfs2(son[u],tp);
for(int i=adj[u];i!=-1;i=k[i].next){
int o=k[i].t;
if(o!=son[u]&&o!=fa[u])
Dfs2(o,o);
}
}
int sum[1200001];
void pushup(int x){
sum[x]=sum[x<<1]+sum[x<<1|1];
}
void build(int l,int r,int x){
if(l==r){
sum[x]=v[pos[l]];
return;
}
int mid=(l+r)>>1;
build(l,mid,x<<1);
build(mid+1,r,x<<1|1);
pushup(x);
}
int query(int s,int t,int l,int r,int x){
if(s<=l&&r<=t)
return sum[x];
int mid=(l+r)>>1,res=0;
if(s<=mid)
res+=query(s,t,l,mid,x<<1);
if(t>mid)
res+=query(s,t,mid+1,r,x<<1|1);
return res;
}
int ask(int x,int y){
int fx=top[x],fy=top[y];
int res=0;
while(fx^fy){
if(dp[fx]<dp[fy]){
swap(fx,fy);
swap(x,y);
}
res+=query(id[fx],id[x],1,n,1);
x=fa[fx];fx=top[x];
}
if(dp[x]>dp[y])
swap(x,y);
if(id[x]<id[y])
res+=query(id[x]+1,id[y],1,n,1);
return res;
}
int cha[300001];
void S(int x,int y){
cha[x]++;
cha[y+1]--;
return;
}
void C(int x,int y){
int fx=top[x],fy=top[y];
while(fx^fy){
if(dp[fx]<dp[fy]){
swap(fx,fy);
swap(x,y);
}
S(id[fx],id[x]);
x=fa[fx];fx=top[x];
}
if(dp[x]<dp[y])
swap(x,y);
S(id[son[y]],id[x]);
}
bool judge(int diss){
memset(cha,0,sizeof(cha));
int s=0;
for(int i=1;i<=m;++i)
if(dis[i]>diss){
s++;
C(fr[i],to[i]);
}
if(!s)
return true;
for(int i=1;i<=n;++i)
cha[i]+=cha[i-1];
for(int i=2;i<=n;++i)
if(cha[id[i]]==s&&maxn-v[i]<=diss)
return true;
return false;
}
int erfen(int l,int r){
if(l==r)
return r;
int mid=(l+r)>>1;
if(judge(mid))
return erfen(l,mid);
else
return erfen(mid+1,r);
}
int main()
{
freopen("transport.in","r",stdin);
freopen("transport.out","w",stdout);
memset(adj,-1,sizeof(adj));
n=read();m=read();
for(int i=1;i<n;++i){
x=read();y=read();z=read();
init(x,y,z);
init(y,x,z);
}
Dfs1(1);Dfs2(1,1);
build(1,n,1);
for(int i=1;i<=m;++i){
fr[i]=read();
to[i]=read();
dis[i]=ask(fr[i],to[i]);
if(dis[i]>maxn)
maxn=dis[i];
}
printf("%d",erfen(0,maxn));
//while(1);
return 0;
}