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】快餐店的更多相关文章

  1. 【BZOJ3242】【NOI2013】快餐店(动态规划)

    [BZOJ3242][NOI2013]快餐店(动态规划) 题面 BZOJ 题解 假设我们要做的是一棵树,那么答案显然是树的直径的一半. 证明? 假设树的直径是\(2d\),那么此时最远点的距离是\(d ...

  2. bzoj 3242: [Noi2013]快餐店 章鱼图

    3242: [Noi2013]快餐店 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 266  Solved: 140[Submit][Status] ...

  3. [UOJ#122][NOI2013]树的计数

    [UOJ#122][NOI2013]树的计数 试题描述 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的 DFS 序以及 BFS 序.两棵不同的树的 DFS 序 ...

  4. P1399 [NOI2013] 快餐店 方法记录

    原题题面P1399 [NOI2013] 快餐店 题目描述 小 T 打算在城市 C 开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小 T 希望快餐店的地址选在离最 ...

  5. UOJ#126【NOI2013】快餐店

    [NOI2013]快餐店 链接:http://uoj.ac/problem/126 YY了一个线段树+类旋转卡壳的算法.骗了55分.还比不上$O(n^2)$暴力T^T 题目实际上是要找一条链的两个端点 ...

  6. UOJ #126 【NOI2013】 快餐店

    题目链接:快餐店 震惊!某ZZ选手此题调了一天竟是因为……>>点击查看 一般碰到这种基环树的题都要先想想树上怎么做.这道题如果是在树上的话……好像求一遍直径就做完了?答案就是直径长度的一半 ...

  7. 【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 ...

  8. bzoj3242 [Noi2013]快餐店

    Description 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方. 快餐店的顾客分布在城 ...

  9. BZOJ3242 [Noi2013]快餐店 【环套树 + 单调队列dp】

    题目链接 BZOJ3242 题解 题意很清楚,找一点使得最远点最近 如果是一棵树,就是直径中点 现在套上了一个环,我们把环单独拿出来 先求出环上每个点外向树直径更新答案,并同时求出环上每个点外向的最远 ...

随机推荐

  1. bzoj2301

    题解: 莫比乌斯反演 再加上一个分块 然后和上一题差不多了 代码: #include<cstdio> #include<cmath> #include<algorithm ...

  2. [BZOJ1269]文本编辑器editor

    Problem 有n个操作 Solution splay模板题,用splay维护下标. Notice 需要把l的前一个位置旋转到根,r的后一个位置旋转到根的右节点.所以特别要注意0的大坑. Code ...

  3. HTML(三)选择器--复杂选择器

    1.父子选择器/派生选择器 <div calss="wrapper"> <span calss="box">123</span&g ...

  4. day29 socketsever ftp功能简单讲解

    今日所学 一.ftp上传简单实例 二.socketsever的固定用法 三.验证合法性连接 1.ftp上传实例 这个题目是我们现在网络编程比较基础一点的题目 下面我们只写简单上传的代码 上传服务端的代 ...

  5. vue引用样式

    cnpm i sass-loader node-sass -D <link rel="stylesheet" href="./static/reset.css&qu ...

  6. 【转载】Maven中的BOM概念

    1.概述 1.1.什么是 BOM? BOM stands for Bill Of Materials. A BOM is a special kind of POM that is used to c ...

  7. 二:通过VirtualBox+Vagrant创建一个centos的虚拟机:

    官网安装VirtualBox及Vagrant. 下载centos7,添加到vagrant中. http://e-proxy.yfb.sunline.cn/download/vagrant/centos ...

  8. Zabbix4.0监控URL

    一:新建群组 1.1:web monitor 二:新建模板 2.1:配置-模板-模板 2.3:创建应用集 配置-模板-web monitor-应用集 2.4:创建web场景 2.5:创建场景步骤: 以 ...

  9. MyEclipse和Eclipse

    Eclipse 分成3个子项目: ·平台Platform ·开发工具箱-Java Development Toolkit(JDT) ·外挂开发环境-Plug-in Development Enviro ...

  10. MySQL:安装mysqld系统及基础应用

    MySQL篇 第一章.安装mysqld系统及基础应用 一.安装 注意:mysql的标点符号只能是英文的标点符号. 1.设置配置文件. 文件格式:文本格式 文件位置:Mysql的主目录下 文件名称:my ...