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. mq(1):简介

    1.mq的使用场景 以前的我,一直都没太搞明白,为什么我们那么需要消息队列,直到我看到了网友scienjus.的这个例子. 例子:假设用户在你的软件中注册,服务端收到用户的注册请求后,它会做这些操作: ...

  2. hMailServer SSL 配置

    1.先安装 openssl , 调用如下命令,生成证书: openssl genrsa -des3 - openssl req -new -key alics.key -out alics.req o ...

  3. 深入理解java虚拟机---Class文件(二十)

    无符号数.表 当实现了不同语言的编译器,比如jython,jruby等等,那么就可以利用这些语言编写代码,通过各自的编译器编译成符合jvm规范的字节码文件,就可以利用jvm来执行了. Class文件在 ...

  4. Comparable和Comparator接口是干什么的?列出它们的区别。

    Comparable和Comparator接口是干什么的?列出它们的区别. Java提供了只包含一个compareTo()方法的Comparable接口.这个方法可以个给两个对象排序.具体来说,它返回 ...

  5. JAVA 中的MessageDigest类和Mac类的使用

    MessageDigest 消息摘要 例子: MD5加密: try{ MessageDigest md5 = MessageDigest.getInstance("MD5"); m ...

  6. 关于js中函数的调用问题

    js中函数的调用方法 1.直接调用 函数名(参数): 2.通过指向函数的变量去调用 例如: var myval = 函数名: 此刻 myval是指向函数的一个指针: myval(实际参数):此刻调用的 ...

  7. 使用 DirectX 创建 3D 图形

    官方链接   https://msdn.microsoft.com/zh-cn/library/windows/desktop/hh465137.aspx 使用 Windows 运行时初始化 Dire ...

  8. 实力封装:Unity打包AssetBundle(一)

    说明:这是一系列循序渐进的教程,今天先介绍最简单的AssetBundle打包方式. 这是一个由在Unity中需要加载模型而引发出来的一系列坑,为了填坑花了不少时间,如果有需要在Unity中自定义菜单, ...

  9. shell脚本实例-for实现批量主机的探测

    #!/usr/bin/bash >ip.txt for i in {2..254} do { ip=192.168.234.$i ping -c1 -W1 $ip &>/dev/n ...

  10. 再谈kbmMW垃圾回收

    很早就写了关于kbmMW Server如何实现的垃圾回收,但最近一段时间还是为此遇到问题,实现的Server不能稳定运行,发生问题后不响应客户端的查询请求,在客户端得到服务端返回地址错误信息,只能重启 ...