link

这是一道假的图论

思维难度很低,代码量偏高

就是一道板子+二分

树上差分就AC了

注意卡常即可

二分枚举答案x,为时间长度

将每一个长度大于x的计划链长记录下来(有几个,总需要减少多少长度)

在树上跑一跑即可

树上差分就将u,vv权值+1,lca(u,v)-2即可

dp[i]:为子树权值和,也是i上面道路有几条路径覆盖

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
inline int read()
{
int f=,ans=;char c;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
int n,m;
struct node{
int u,v,w,nex;
}x[];
int deep[],vt[],dis[],fa[][],head[],cnt=;
void add(int u,int v,int w)
{
x[cnt].u=u,x[cnt].v=v,x[cnt].w=w,x[cnt].nex=head[u],head[u]=cnt++;
}
void dfs(int f,int fath,int DIS)
{
deep[f]=deep[fath]+;
dis[f]=DIS;
fa[f][]=fath;
for(int i=;(<<i)<=deep[f];i++) fa[f][i]=fa[fa[f][i-]][i-];
for(int i=head[f];i;i=x[i].nex)
{
if(x[i].v==fath) continue;
vt[x[i].v]=x[i].w;
dfs(x[i].v,f,DIS+x[i].w);
}
return;
}
int lca(int u,int v)
{
if(deep[u]<deep[v]) swap(u,v);
for(int i=;i>=;i--)
if(deep[u]-(<<i)>=deep[v]) u=fa[u][i];
if(u==v) return u;
for(int i=;i>=;i--)
{
if(fa[u][i]==fa[v][i]) continue;
u=fa[u][i],v=fa[v][i];
}return fa[u][];
}
struct node1{
int x,y,lca,dis;
}s[];
int l,r,mid,dp[];
void dp_tree(int f,int fath)
{
for(int i=head[f];i;i=x[i].nex)
{
if(x[i].v==fath) continue;
dp_tree(x[i].v,f);
dp[f]+=dp[x[i].v];
}
return;
}
bool check(int st)
{
memset(dp,,sizeof(dp));
int tot=,maxn=;
for(int i=;i<=m;i++)
{
if(s[i].dis>st)
{
tot++;
dp[s[i].x]++,dp[s[i].y]++,dp[s[i].lca]-=;
maxn=max(maxn,s[i].dis-st);
}
}
dp_tree(,);
for(int i=;i<=n;i++)
if(dp[i]==tot&&vt[i]>=maxn) return ;
return ;
}
int data=<<-;
int main()
{
n=read(),m=read();
for(int i=;i<n;i++)
{
int u=read(),v=read(),w=read();
add(u,v,w),add(v,u,w);
}
dfs(,,);
for(int i=;i<=m;i++)
{
s[i].x=read(),s[i].y=read();
s[i].lca=lca(s[i].x,s[i].y);
s[i].dis=dis[s[i].x]+dis[s[i].y]-(dis[s[i].lca]<<);
r=max(r,s[i].dis);
}
while(l<=r)
{
mid=l+r>>;
if(check(mid)) data=min(data,mid),r=mid-;
else l=mid+;
}
printf("%d",data);
}

[NOIP 2005] 运输计划的更多相关文章

  1. 4632 NOIP[2015] 运输计划

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

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

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

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

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

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

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

  5. NOIP[2015] 运输计划

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

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

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

  7. NOIP 2015运输计划

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

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

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

  9. noip 2015 运输计划 (lca+二分)

    /* 95 最后一个点T了 qian lv ji qiong 了 没学过树剖 听chx听xzc说的神奇的方法 Orz 首先求出每个计划的路径长度 这里写的倍增 然后二分答案 对于每个ans 统计> ...

随机推荐

  1. postman使用感言

    这段时间接口测试一直使用的postman,一款谷歌接口测试插件,感受如下 优点: 1.对于中小型公司来说应该是够用的,特别是一键接口环境切换,一键设置header,作为一般的接口测试来说已经很不错了, ...

  2. Python常见的脚本汇总

    1.冒泡排序 lis = [56,12,1,8,354,10,100,34,56,7,23,456,234,-58] def sortport(): for i in range(len(lis)-1 ...

  3. Siki_Unity_1-4_C#编程(零基础)

    1-4 C#编程(零基础) 任务1:第一章课程资料 任务2:简介 任务3:安装设置IDE工具 Unity内置IDE:MonoDevelop 推荐Visual Studio 下载/安装 VS Commu ...

  4. Java开发工程师(Web方向) - 04.Spring框架 - 第5章.Web框架

    第5章--Web框架 Web框架概述 Web框架单元测验 本次得分为:13.50/15.00, 本次测试的提交时间为:2017-09-25 1单选(2分) 关于Spring MVC中Dispatche ...

  5. Java开发工程师(Web方向) - 03.数据库开发 - 第3章.SQL注入与防范

    第3章--SQL注入与防范 SQL注入与防范 经常遇到的问题:数据安全问题,尤其是sql注入导致的数据库的安全漏洞 国内著名漏洞曝光平台:WooYun.org 数据库泄露的风险:用户信息.交易信息的泄 ...

  6. lr 常用操作

    lr脚本编写语法: web_add_cookie();:服务器注入cookies lr_save_string("网址或其他","参数2");:一个保存函数,它 ...

  7. Java学习笔记-13.创建窗口和程序片

    1.init()方法:程序片第一次被创建,初次运行初始化程序片时调用. start()方法:每当程序片进入web浏览器中,并且允许程序片启动他的常规操作时调用(特殊的程序片被stop()关闭):同样在 ...

  8. 《梦断代码Dreaming In Code》阅读计划

    书籍是人类宝贵的精神财富,读书是人们重要的学习方式,是人生奋斗的航灯,是文化传承的通道,是人类进步的阶梯.学生作为学习人群的主体,必须把读书作为头等大事.学校就是一个学生在教师指导下自主读书的空间,而 ...

  9. Java Class Object

    Object类 它是所有类的基类. public class Person { } //实际上是 public class Person extends Object { } Object类的方法 t ...

  10. java的参数传递

    1按值传递:传递的是原始值的副本,而不是原始值的内存地址 基本数据类型是传原始值的副本 class Test02 { public static void main(String[] args) { ...