【BZOJ3242】【UOJ#126】【NOI2013】快餐店
NOI都是这种难度的题怎么玩嘛QAQ
原题:
小T打算在城市C开设一家外送快餐店。送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方。 快餐店的顾客分布在城市C的N 个建筑中,这N 个建筑通过恰好N 条双向道路连接起来,不存在任何两条道路连接了相同的两个建筑。任意两个建筑之间至少存在一条由双向道路连接而成的路径。小T的快餐店可以开设在任一建筑中,也可以开设在任意一条道路的某个位置上(该位置与道路两端的建筑的距离不一定是整数)。 现给定城市C的地图(道路分布及其长度),请找出最佳的快餐店选址,输出其与最远的顾客之间的距离。
N<=10^5,Li<=10^9
恩题解比较好理解但是比较难想到……
首先答案不一定是图上的半径,比如酱:
因为有环,所以图上直径的中点到其它所有点距离的最大值可能比半径还要大,这个时候半径就不是最优值
然后显然答案是环上删去某边后树的直径,这个写n^2算法的时候会用到
然后dfs找出环,对环上每个点令其为根求出高度及直径
然后顺着扫一遍,每次记录前面所有环上边的和sum,当前节点子树高度和sum的和的最大值f1,(前面深度最大和次大子树的深度的和)和这两个子树根节点之间的距离的和的最大值f2
然后反过来再搞一遍搞出f3和f4
统计答案即可,注意还有跨过环上第一个点和最后一个点之间的边的情况,这个结合f1和f3就行
最后还要用环上所有点的子树直径的最大值更新ans(不知道为什么QAQ
NOI都是这种难度的题怎么玩嘛QAQ
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long
int rd(){int z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;}
struct edg{int nxt,y,v;}e[]; int lk[],ltp=;
inline void ist(int x,int y,int z){ e[++ltp]=(edg){lk[x],y,z}; lk[x]=ltp;}
int n;
bool vstd[]; int stck[],tp=,fthv[];
int ccd[],cct=,ccv[];
ll dp[];
ll f[],f1[],f2[],f3[],f4[];
ll mxf=;
bool gtcc(int x,int y){
stck[++tp]=x;
if(vstd[x]){
fill(vstd,vstd++n,false);
do vstd[ccd[++cct]=stck[tp]]=true,ccv[cct]=fthv[stck[tp--]];while(stck[tp]!=x);
return true;}
vstd[x]=true;
for(int i=lk[x];i;i=e[i].nxt)if(e[i].y!=y){
fthv[e[i].y]=e[i].v;
if(gtcc(e[i].y,x)) return true;}
--tp;
return false;}
void gtdp(int x,int y){
for(int i=lk[x];i;i=e[i].nxt)if(e[i].y!=y && !vstd[e[i].y]){
dp[e[i].y]=dp[x]+e[i].v,gtdp(e[i].y,x);
mxf=max(mxf,f[x]+f[e[i].y]+e[i].v);
f[x]=max(f[x],f[e[i].y]+e[i].v);}}
int main(){//freopen("ddd.in","r",stdin);
int l,r,z; cin>>n;
for(int i=;i<=n;++i) l=rd(),r=rd(),z=rd(),ist(l,r,z),ist(r,l,z);
if(!gtcc(,)) return ;
for(int i=;i<=cct;++i) gtdp(ccd[i],);
ll bwl=,mx=,ans=,tt=ccv[cct],tmp; ccv[cct]=;
for(int i=;i<=cct;++i){
bwl+=ccv[i-];
f1[i]=max(f1[i-],bwl+f[ccd[i]]);
f2[i]=max(f2[i-],mx+bwl+f[ccd[i]]);
mx=max(mx,f[ccd[i]]-bwl);}
bwl=mx=;
for(int i=cct;i>=;--i){
bwl+=ccv[i];
f3[i]=max(f3[i+],bwl+f[ccd[i]]);
f4[i]=max(f4[i+],mx+bwl+f[ccd[i]]);
mx=max(mx,f[ccd[i]]-bwl);}
ans=f2[cct];
for(int i=;i<cct;++i){
tmp=max(f1[i]+f3[i+]+tt,max(f2[i],f4[i+]));
ans=min(ans,tmp);}
ans=max(ans,mxf);
printf("%.1lf\n",ans*1.0/);
return ;}
【BZOJ3242】【UOJ#126】【NOI2013】快餐店的更多相关文章
- 【BZOJ3242】【NOI2013】快餐店(动态规划)
[BZOJ3242][NOI2013]快餐店(动态规划) 题面 BZOJ 题解 假设我们要做的是一棵树,那么答案显然是树的直径的一半. 证明? 假设树的直径是\(2d\),那么此时最远点的距离是\(d ...
- bzoj 3242: [Noi2013]快餐店 章鱼图
3242: [Noi2013]快餐店 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 266 Solved: 140[Submit][Status] ...
- [UOJ#122][NOI2013]树的计数
[UOJ#122][NOI2013]树的计数 试题描述 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的 DFS 序以及 BFS 序.两棵不同的树的 DFS 序 ...
- P1399 [NOI2013] 快餐店 方法记录
原题题面P1399 [NOI2013] 快餐店 题目描述 小 T 打算在城市 C 开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小 T 希望快餐店的地址选在离最 ...
- UOJ#126【NOI2013】快餐店
[NOI2013]快餐店 链接:http://uoj.ac/problem/126 YY了一个线段树+类旋转卡壳的算法.骗了55分.还比不上$O(n^2)$暴力T^T 题目实际上是要找一条链的两个端点 ...
- UOJ #126 【NOI2013】 快餐店
题目链接:快餐店 震惊!某ZZ选手此题调了一天竟是因为……>>点击查看 一般碰到这种基环树的题都要先想想树上怎么做.这道题如果是在树上的话……好像求一遍直径就做完了?答案就是直径长度的一半 ...
- 【BZOJ 3242】【UOJ #126】【CodeVS 3047】【NOI 2013】快餐店
http://www.lydsy.com/JudgeOnline/problem.php?id=3242 http://uoj.ac/problem/126 http://codevs.cn/prob ...
- bzoj3242 [Noi2013]快餐店
Description 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方. 快餐店的顾客分布在城 ...
- BZOJ3242 [Noi2013]快餐店 【环套树 + 单调队列dp】
题目链接 BZOJ3242 题解 题意很清楚,找一点使得最远点最近 如果是一棵树,就是直径中点 现在套上了一个环,我们把环单独拿出来 先求出环上每个点外向树直径更新答案,并同时求出环上每个点外向的最远 ...
随机推荐
- hdu1693
题解: 还是插头dp 代码: #include<cstdio> #include<cstring> #include<algorithm> #include< ...
- 前端小菜鸡使用Vue+Element笔记(二)
记录一下在使用Vue和Element做项目时遇到过的难点... 1.在 <el-table>表格中嵌入 select下拉选择框,以及 tooltip提示框的使用 主要定义格式如红色标记代码 ...
- Mac生成rsa证书
详细参考大神 https://blog.csdn.net/qq_30513483/article/details/51242338 RSA为一种加密算法,生成的文件格式有两种,一种是PEM格式,另一种 ...
- Buffer与Cache区别 简要说明
Buffer – 缓冲区 写 用户写入数据存储区域 解决写入冲突 CPU-Memoury-Disk Cache – 缓存区 读 用户读取缓存数据使用 临时存储 Disk-memo ...
- SQL-18 查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不准使用order by
题目描述 查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no.薪水salary.last_name以及first_name,不准使用order byCREATE ...
- DevExpress WinForms v18.2新版亮点(四)
行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WinForms v1 ...
- easyui datagrid 首次不加载做法
我们一般遇到首次不执行查询,只有你点击查询按钮才查询的功能 我使用easyui的datagird做法是这样的: onBeforeLoad: function (param) { var firstLo ...
- JSONP解决跨域问题,什么是JSONP(转)
原文链接:https://www.cnblogs.com/xinxingyu/p/6075881.html 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的 ...
- mysql修改lower_case_table_names产生的问题
1.参数含义: lower_case_table_names: 此参数不可以动态修改,必须重启数据库 lower_case_table_names = 1 表名存储在磁盘是小写的,但是比较的时候是不区 ...
- centos7安装maven,git
1.maven 下载 2.安装包 解压 3.配置maven环境变量 4.检查是否安装成功 5.检查是否安装 git 6.yum 安装 git 7.配置 git 环境变量 8.检查git是否安装成功 1 ...