[Bzoj2282]消防(二分答案+树的直径)
Description
某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000)。
这个国家的人对火焰有超越宇宙的热情,所以这个国家最兴旺的行业是消防业。由于政府对国民的热情忍无可忍(大量的消防经费开销)可是却又无可奈何(总统竞选的国民支持率),所以只能想尽方法提高消防能力。
现在这个国家的经费足以在一条边长度和不超过s的路径(两端都是城市)上建立消防枢纽,为了尽量提高枢纽的利用率,要求其他所有城市到这条路径的距离的最大值最小。你受命监管这个项目,你当然需要知道应该把枢纽建立在什么位置上。
n<=300000
Solution
显然,要求的路径一定在树的直径上,那么二分答案
然后计算其他点到直径的距离的最大值做为二分的l
Code
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#define N 300010
#define ll long long
using namespace std;struct info{int fr,to,nex,w;}e[N*2];
int n,s,tot,head[N],Ans,st,ed,len,pre[N],u;
vector<int> V;
ll l,r=1e16;inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}inline void Link(int u,int v,int w){e[++tot].to=v;e[tot].fr=u;e[tot].w=w;e[tot].nex=head[u];head[u]=tot;
}bool vis[N],is_path[N];
ll dis[N];
int id,mx;
queue<int> q;
void bfs(int s){memset(vis,0,sizeof(vis));memset(dis,0,sizeof(dis));while(!q.empty()) q.pop();vis[s]=1,mx=0;q.push(s);while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i;i=e[i].nex){int v=e[i].to;if(vis[v]) continue;vis[v]=1;dis[v]=dis[u]+e[i].w*(is_path[v]^1);l=max(l,dis[v]);pre[v]=u;q.push(v);if(dis[v]>mx){mx=dis[v];id=v;}}}
}bool check(ll m){int l=0,r=len-1;while(l<len&&V[0]-V[l]<=m) l++;l--;while(r>=0&&V[r]<=m) r--;r++;return V[l]-V[r]<=s;
}void Init(){n=read(),s=read();for(int i=1;i<n;++i){int u=read(),v=read(),w=read();Link(u,v,w);Link(v,u,w);}bfs(1);st=id;bfs(id);ed=id;for(u=ed;u!=st;u=pre[u]) V.push_back(dis[u]),is_path[u]=1;V.push_back(dis[u]);is_path[u]=1;len=V.size();l=0;bfs(ed);
}void Solve(){while(l<r){ll m=(l+r)>>1;if(check(m)) Ans=m,r=m;else l=m+1;}printf("%d\n",Ans);
}int main(){Init(); Solve(); return 0;
}
转载于:https://www.cnblogs.com/void-f/p/8639122.html
[Bzoj2282]消防(二分答案+树的直径)相关推荐
- nssl1156-今天你AK了吗?【康托展开,高精度,二分答案,树状数组】
正题 题目大意 求n个数的全排列的第k个. 解题思路 首先康拓逆展开 ∑ii<=nxi(n−i)!\sum^{i<=n}_i x_i(n-i)!∑ii<=nxi(n−i)! 求每 ...
- AtCoder Regular Contest 101 (ARC101) D - Median of Medians 二分答案 树状数组
原文链接https://www.cnblogs.com/zhouzhendong/p/ARC101D.html 题目传送门 - ARC101D 题意 给定一个序列 A . 定义一个序列 A 的中位数为 ...
- 二分+树的直径 [Sdoi2011]消防
问题 D: [Sdoi2011]消防 时间限制: 1 Sec 内存限制: 512 MB 提交: 12 解决: 6 [提交][状态][讨论版] 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且 ...
- P1099 树的直径 DFS + 二分 / 尺取法
题意 传送门 P1099 树网的核 在任意一条直径上求出的最小偏心距都相等. 树上只有一条直径时显然成立.当树有多条直径,它们必定相交,且中点汇聚于同一处,那么中心附近树的各条直径的重叠部分是相同的, ...
- [BZOJ4556][TJOI2016HEOI2016]字符串(二分答案+后缀数组+RMQ+主席树)
4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1360 Solved: 545 ...
- 【题解】 [HEOI2016]排序题解 (二分答案,线段树)
题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行 ...
- [APIO2018] New Home 新家(线段树,二分答案,离散化)
[APIO2018] New Home 新家 Solution 对于时间轴我们直接离散化+扫描线,维护每一个商店的加入和删除. 对于询问(x,t)(x,t)(x,t),不好直接回答,这里的关键一步是: ...
- 牛客题霸 [ 树的直径] C++题解/答案
牛客题霸 [ 树的直径] C++题解/答案 题目描述 给定一棵树,求出这棵树的直径,即两个节点距离的最大值. 题解: 不知道大家听没听过一个结论: 树的直径可以通过两边dfs找到 步骤: 1.从任意一 ...
- YBTOJ洛谷P2839:最大中位数(主席树、二分答案)
遇事不决,二分试试 解析 很好的一道题 真是把主席树玩明白了 一个关于中位数的常用trick: 二分答案mid,把>=mid的看成1,<mid的看成-1,然后看最大子段和是否>=0 ...
最新文章
- 深度学习与工业互联网安全
- Android第三十八期 - 评价标签FlowLayout
- 中石油训练赛 - 位置(模拟+思维)
- Zookeeper Listener分析
- 有100个GMAIL的邀请,需要的来信就可以啦。
- access insert语句怎么写_码住!MySQL中超实用的几种SQL语句
- 【174个】最全DICOM资料汇总[截止10.10.20][中国数字医疗论坛]
- SPSS学习(五)独立样本t检验
- 微信小程序:2022虎年全新头像框制作
- 要闻君说:华为“发飙”了;快手抛出了1000+社招岗位;迅雷2018年度财报:云连续三年上涨;定论!小米成立AIoT战略委员会...
- mac电脑谷歌浏览器全屏显示选项卡
- 常见720P和1080P的分辨率倒底是多少?
- SpringBoot + Thymeleaf 练手小项目 --------- 豆瓣网站模拟
- MapBox使用之路线规划
- 浅谈Unity的渲染优化(1): 性能分析和瓶颈判断(上篇)
- MySQL笔记:第11章_数据处理之增删改
- 蓝牙技术|蓝牙助力智能手表的未来发展
- java导出doc文档
- 他们是公众号界的一股清流!
- VMware上Ubuntu实现和windows复制粘贴