题面

解题思路

搞了三个多小时。。。。

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. 洛谷P3239 [HNOI2015]亚瑟王

    题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个看脸的游戏,技能 ...

  2. Java虚拟机性能管理神器 - VisualVM(8) 查找JAVA应用程序耗时的方法函数【转】

    Java虚拟机性能管理神器 - VisualVM(8) 查找JAVA应用程序耗时的方法函数[转] 标签: javajvm监控工具性能优化 2015-04-07 16:47 1846人阅读 评论(0)  ...

  3. IDEA将代码推送至远程GitHub仓库

    1 在项目根路径下添加.gitignore文件 2 创建本地git仓库 3 git add操作 快捷键 ctrl+alt+a 4 git commit操作 快捷键ctrl+k 5 git push操作 ...

  4. Python 的一些方法

    有关 Python 内编写类的各种技巧和方法(构建和初始化.重载操作符.类描述.属性访问控制.自定义序列.反射机制.可调用对象.上下文管理.构建描述符对象.Pickling). 你可以把它当作一个教程 ...

  5. leetcode 132 Palindrome Pairs 2

    lc132 Palindrome Pairs 2 大致与lc131相同,这里要求的是最小分割方案 同样可以分割成子问题 dp[i][j]还是表示s(i~j)是否为palindrome res[i]则用 ...

  6. 2016.8.16上午纪中初中部NOIP普及组比赛

    2016.8.16上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1334 这次也翻车了,感觉比之前难多了. 辛辛苦苦改完了,太难改 ...

  7. 廖雪峰Java15JDBC编程-2SQL入门-2insert/select/update/delete

    1. INSERT用于向数据库的表中插入1条记录 insert into 表名 (字段1,字段2,...) values (数据1,数据2,数据3...) 示例 -- 如果表存在,就删除 drop t ...

  8. http response 过长 导致Connection reset

    http response 过长(2W byte) 导致Connection reset

  9. 《DSP using MATLAB》Problem 7.37

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  10. 在HBase之上构建SQL引擎