【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 题解 题意很清楚,找一点使得最远点最近 如果是一棵树,就是直径中点 现在套上了一个环,我们把环单独拿出来 先求出环上每个点外向树直径更新答案,并同时求出环上每个点外向的最远 ...
随机推荐
- mybatis generator工具的使用
mybatis反转数据库的配置文件: generatorConfig.xml: <?xml version="1.0" encoding="UTF-8"? ...
- Saiku二次开发获取源代码在本地编译(五)
关于Saiku的二次开发,在本地编译然后启动自己编译好的Saiku服务 Saiku是开源的,从github上能下载源代码,本例中的saiku源码也是从github上找的,然后自己改了一些pom.xml ...
- js批量上传文件
html代码: <input type="file" id='upload' name="upload" multiple="multiple& ...
- Mac下安装ipython与jupyter
IPython从Python发展而来,更倾向于科学计算.互联网数据分析更喜欢用. 首先切换root用户: sudo su - pip3自动安装ipython yuchaodeMacBook-Pro:~ ...
- 循环神经网络-极其详细的推导BPTT
首先明确一下,本文需要对RNN有一定的了解,而且本文只针对标准的网络结构,旨在彻底搞清楚反向传播和BPTT. 反向传播形象描述 什么是反向传播?传播的是什么?传播的是误差,根据误差进行调整. 举个例子 ...
- python 列表和元组
一,基本的列表操作 1.该表列表,元素赋值 示例: >>>x = [1,1,1] >>>x[1] = 2 >>>x [1,2,1] 2.删除元素 ...
- 《uniGUI for cBuilder入门到精通》新书预定
<uniGUI for cBuilder入门到精通>火热预定中,从零开始带你入瓮带你飞,手把手教你如何快速安装,开发和部署一个web系统,前十名用户售价暂定100元,后续价格每本200元, ...
- Day20作业及默写
1.请使用C3算法计算出链接图中的继承顺序-Link 一 graph BT id1[A]-->id2[B] id2[B]-->id6[F] id6[F]-->id7[G] id1[A ...
- winform dataGridView中的button点击判断
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (e.RowI ...
- php发送邮件(TP5)
先百度搜索phpmailer 下载phpmailer函数包 放到/vendor/下,这是tp5扩展类库目录 然后你需要一个已经开启了SMTP服务的邮箱,作为发送者邮箱,QQ邮箱163邮箱是需要自己开 ...