题面

解题思路

搞了三个多小时。。。。

noip时的数据很水,直接暴力n^3过。

我们考虑优化,首先可以贪心,我们要在直径上选肯定越插长越好,所以n^2其实就可以解决。但这还不够,根据直径的最长性,我们可以用一个单调队列优化。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm> using namespace std;
const int MAXN = 500005;
const int inf = 0x7fffffff; inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-48;ch=getchar();}
return x*f;
} int n,s,num,a[MAXN],father[MAXN];
int head[MAXN],cnt,D,top[MAXN],d[MAXN];
int to[MAXN<<1],nxt[MAXN<<1],val[MAXN<<1];
int ans=inf,dis[MAXN],diameter,mx,st,last;
bool vis[MAXN]; inline void add(int bg,int ed,int v){
to[++cnt]=ed,val[cnt]=v,nxt[cnt]=head[bg],head[bg]=cnt;
} inline void dfs1(int x,int fa){
for(register int i=head[x];i;i=nxt[i]){
int u=to[i];
if(u==fa) continue;
dis[u]=max(dis[u],dis[x]+val[i]);
if(dis[u]>mx){
mx=dis[u];
st=u;
}
dfs1(u,x);
}
} inline void dfs2(int x,int fa){
for(register int i=head[x];i;i=nxt[i]){
int u=to[i];
if(u==fa) continue;
father[u]=x;
dis[u]=max(dis[u],dis[x]+val[i]);
if(dis[u]>diameter){
diameter=dis[u];
last=u;
}
dfs2(u,x);
}
} inline void dfs4(int rt,int x,int DIS){
for(register int i=head[x];i;i=nxt[i]){
int u=to[i];
if(vis[u]) continue;
vis[u]=1;
if(DIS+val[i]>d[rt])
d[rt]=DIS+val[i];
dfs4(rt,u,DIS+val[i]);
vis[u]=0;
}
} int main(){
n=rd();s=rd();
for(register int i=1;i<n;i++){
int x=rd(),y=rd(),z=rd();
add(x,y,z);add(y,x,z);
}
dfs1(1,0);
for(register int i=1;i<=n;i++) dis[i]=0;
dfs2(st,0);
// cout<<diameter<<endl;
D=diameter;
mx=0;
for(register int i=last;i;i=father[i]) {
top[++num]=i;vis[i]=1;
a[i]=dis[last]-dis[i];
// cout<<a[i]<<endl;
}
// for(register int i=1;i<=num;i++) cout<<a[i]<<endl;
for(register int i=1;i<=num;i++) dfs4(top[i],top[i],0),mx=max(mx,d[top[i]]);
// for(register int i=1;i<=num;i++) cout<<top[i]<<" "<<a[top[i]]<<endl;;
// ans=max(d[top[1]],max(a[top[1]],a[top[num]]-a[top[1]]));
int l=1;
for(register int i=1;i<=num;i++){
if(l==num) break;
while(a[top[l+1]]-a[top[i]]<=s && l<num) l++;
int now=max(mx,max(a[top[i]],a[top[num]]-a[top[l]]));
ans=min(ans,now);
}
printf("%d",ans);
return 0;
}

BZOJ 1099 树网的核的更多相关文章

  1. bzoj1999 (洛谷1099) 树网的核——dfs

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1999  https://www.luogu.org/problemnew/show/P109 ...

  2. Luogu 1099 树网的核

    bzoj1999 数据加强版(n <= 5e5) 较早的noip题,值得研究 重要结论:直径的最长性,任何从直径中离开直径的点到它离开的点的距离,都不会比直径的另一端到它离开的点长(否则就有新的 ...

  3. luogu 2491 [SDOI2011]消防 / 1099 树网的核 单调队列 + 树上问题

    Code: #include<bits/stdc++.h> #define ll long long #define maxn 300001 #define inf 1000000000 ...

  4. 洛谷P1099 BZOJ1999 树网的核 [搜索,树的直径]

    洛谷传送门,BZOJ传送门 树网的核 Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork),其中V ...

  5. BZOJ1999或洛谷1099&BZOJ2282或洛谷2491 树网的核&[SDOI2011]消防

    一道树的直径 树网的核 BZOJ原题链接 树网的核 洛谷原题链接 消防 BZOJ原题链接 消防 洛谷原题链接 一份代码四倍经验,爽 显然要先随便找一条直径,然后直接枚举核的两个端点,对每一次枚举的核遍 ...

  6. 5.19[bzoj树网的核]

    围观了final,SJTU还是飞了,泽民同志劲啊! 膜拜归膜拜...回来开题 bzoj1999树网的核 最近就喜欢给自己找切不动的题...QAQ ok.....昨天在家里做了一个下午+晚上 又困&am ...

  7. 洛谷1099 [NOIP2007] 树网的核

    链接https://www.luogu.org/problemnew/show/P1099 题目描述 设T=(V,E,W)是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称TTT为 ...

  8. [BZOJ1999][codevs1167][Noip2007]Core树网的核

    [BZOJ1999][codevs1167][Noip2007]Core树网的核 试题描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(t ...

  9. bzoj1999 / P1099 树网的核

    P1099 树网的核 (bzoj数据加强) 前置知识:树的直径 (并不想贴我的智障写法虽然快1倍但内存占用极大甚至在bzoj上MLE) 正常写法之一:用常规方法找到树的直径,在直径上用尺取法找一遍,再 ...

随机推荐

  1. 单体内置对象——Global对象

    单体内置对象的定义:由ECMAScript实现提供的.不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前已经存在了.意思就是说:开发人员不必显式地实例化内置对象,因为他们已经实例化了. ...

  2. Powerdesigner 生成数据字典

    https://www.jianshu.com/p/f491d0d3c503http://blog.csdn.net/adparking/article/details/50402980http:// ...

  3. 廖雪峰Java15JDBC编程-3JDBC接口-4JDBC事务

    1 数据库事务:Transaction 1.1 定义 若干SQL语句构成的一个操作序列 要么全部执行成功 要么全部执行不成功 1.2 数据库事务具有ACID特性: Atomicity:原子性 一个事务 ...

  4. 思维构造,建图——cf1159E

    很好的题 /* nexti:pi右边第一个比pi大的数的下标 把每个[i,a[i]]都看成一段区间,区间只能在端点处交叉,以此来判断是否有解 特别的,如果a[i]=-1,那么把a[i]=i+1,不对其 ...

  5. LUOGU P3382 【模板】三分法 (三分)

    传送门 解题思路 三分,填坑.每次取l与r的中间值mid,然后向左移一点点,向右移一点点进行判断,判断时用秦九韶算法即可. #include<iostream> #include<c ...

  6. position:fixed失效问题

    fixed定位的元素,如果父级有transform样式,值不为none,那么fixed定位就会失效. 解决方法:使用transform样式的元素,不要包含fixed定位的子元素.

  7. Elasticsearch & Kibana with Shield

    Elasticsearch & Kibana with Shield   官方网站: https://www.elastic.co/guide/en/kibana/current/produc ...

  8. 数据库连接客户端 dbeaver 程序包以及使用说明

    dbeaver 是一个基于 Eclipse 的数据库客户端,支持几乎所有常见的数据库.分为商业版和社区版,社区版可以免费使用. 官网和 GitHub https://dbeaver.io/ https ...

  9. STL容器-deque-双端队列

    注明:全部来自转载,供自己学习与复习使用 deque双向开口可进可出的容器 我们知道连续内存的容器不能随意扩充,因为这样容易扩充别人那去 deque却可以,它创造了内存连续的假象. 其实deque由一 ...

  10. 使用由 Python 编写的 lxml 实现高性能 XML 解析

    lxml 简介 Python 从来不出现 XML 库短缺的情况.从 2.0 版本开始,它就附带了 xml.dom.minidom 和相关的 pulldom 以及 Simple API for XML ...