bzoj 2500 幸福的道路 树上直径+set

2023-10-04 03:10

本文主要是介绍bzoj 2500 幸福的道路 树上直径+set,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先明确:树上任意一点的最长路径一定是直径的某一端点。

所以先找出直径,求出最长路径,然后再求波动值<=m的最长区间

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<ctime>
#include<set>
#define N 1000005
using namespace std;int fa[N],cal[N],dis[2][N],d[N]; int e=1,head[N];struct edge{int u,v,w,next;
}ed[N];void add(int u,int v,int w){ed[e].u=u; ed[e].v=v; ed[e].w=w;ed[e].next=head[u]; head[u]=e++;
}int L,R,it,maxn;bool bo[N];void dfs(int x,int len){bo[x]=1; if(len>maxn) it=x,maxn=len;if(!bo[fa[x]]) dfs(fa[x],len+cal[x]);for(int i=head[x];i;i=ed[i].next){if(!bo[ed[i].v])dfs(ed[i].v,len+ed[i].w);}
}int q[N],h,t;void bfs(int x,int wh){bo[x]=1;int now,v,w; dis[wh][x]=0;q[1]=x; h=t=1;while(h<=t){now=q[h++];if(fa[now]&&!bo[fa[now]]&&dis[wh][fa[now]]<dis[wh][now]+cal[now]){dis[wh][fa[now]]=dis[wh][now]+cal[now];bo[fa[now]]=1; q[++t]=fa[now];}for(int i=head[now];i;i=ed[i].next){v=ed[i].v; w=ed[i].w;if(!bo[v]&&dis[wh][v]<dis[wh][now]+w){dis[wh][v]=dis[wh][now]+w;bo[v]=1; q[++t]=v;}}}
}int n,m;int main()
{ //freopen("race.in","r",stdin);//freopen("race.out","w",stdout);scanf("%d%d",&n,&m);for(int i=2;i<=n;i++){scanf("%d%d",&fa[i],&cal[i]);add(fa[i],i,cal[i]);}maxn=0; memset(bo,0,sizeof bo); dfs(1,0); L=it; maxn=0; memset(bo,0,sizeof bo); dfs(L,0); R=it;memset(bo,0,sizeof bo); bfs(L,0); memset(bo,0,sizeof bo); bfs(R,1);for(int i=1;i<=n;i++) d[i]=max(dis[0][i],dis[1][i]);//printf("%0.2lf\n",(double)clock()/CLOCKS_PER_SEC);multiset<int > ss; int dd,xx,ll=1,ans=0;for(int i=1;i<=n;i++){ss.insert(d[i]);dd=*(--ss.end());xx=*(ss.begin());while(dd-xx>m) ss.erase(ss.find(d[ll++])),dd=*(--ss.end()),xx=*(ss.begin());ans=max(ans,i-ll+1);}printf("%d\n",ans);return 0;
}
然而我打的依旧很蠢。。QAQ

这篇关于bzoj 2500 幸福的道路 树上直径+set的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1178

相关文章

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

poj 3050 dfs + set的妙用

题意: 给一个5x5的矩阵,求由多少个由连续6个元素组成的不一样的字符的个数。 解析: dfs + set去重搞定。 代码: #include <iostream>#include <cstdio>#include <set>#include <cstdlib>#include <algorithm>#include <cstring>#include <cm

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

论文翻译:ICLR-2024 PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS https://openreview.net/forum?id=KS8mIvetg2 验证测试集污染在黑盒语言模型中 文章目录 验证测试集污染在黑盒语言模型中摘要1 引言 摘要 大型语言模型是在大量互联网数据上训练的,这引发了人们的担忧和猜测,即它们可能已

多路转接之select(fd_set介绍,参数详细介绍),实现非阻塞式网络通信

目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds  总结  fd_set操作接口  timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充  获取新连接 注意点 -- 通信时的调用函数 添加新fd到

Android set Tag, findViewWithTag使用

设置了tag为“principal”的view ImageView principal = (ImageView) findViewById(R.id.imagen_home_0);principal.setTag("principal"); 在其它地方获取,获取已经设置了tag为“principal”的view LayoutInflater inflater = LayoutInflate

C++ STL关联容器Set与集合论入门

1. 简介 Set(集合)属于关联式容器,也是STL中最实用的容器,关联式容器依据特定的排序准则,自动为其元素排序。Set集合的底层使用一颗红黑树,其属于一种非线性的数据结构,每一次插入数据都会自动进行排序,注意,不是需要排序时再排序,而是每一次插入数据的时候其都会自动进行排序。因此,Set中的元素总是顺序的。 Set的性质有:数据自动进行排序且数据唯一,是一种集合元素,允许进行数学上的集合相

Eclipse或MyEclipse中Java Working Set管理项目

随着学习JAVA的时间的越来越久,项目也越来越多,Eclipse或MyEclipse界面中显示一堆! 每次工作使用到的项目肯定不会太多...... 每次从这么大数量的工程当中找到自己要使用的, 必须大规模的滚动滚动条...... 图片一   Project Explorer中:    图片二:Package Explorer中: 这样就好找很多了,分类放!

STL set整理

#include<set>#include<cstdio>#include<iterator>#include<iostream>#include<algorithm>using namespace std;//set 集合的操作//multisetset<int>Set1;set<int>Set2;set<int>Set3;/*begin() 返回指向第一个元素的迭代器

解决PHP Warning: strftime(): It is not safe to rely on the system's timezone set

当运行一些程序时,在httpd日志中会有如下警告日志: PHP Warning:  strftime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set(