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

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 #define ll long long
 8 int rd(){int z=0,mk=1;  char ch=getchar();
 9     while(ch<'0'||ch>'9'){if(ch=='-')mk=-1;  ch=getchar();}
10     while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0';  ch=getchar();}
11     return z*mk;}
12 struct edg{int nxt,y,v;}e[210000];  int lk[110000],ltp=0;
13 inline void ist(int x,int y,int z){  e[++ltp]=(edg){lk[x],y,z};  lk[x]=ltp;}
14 int n;
15 bool vstd[110000];  int stck[110000],tp=0,fthv[110000];
16 int ccd[110000],cct=0,ccv[110000];
17 ll dp[110000];
18 ll f[110000],f1[110000],f2[110000],f3[110000],f4[110000];
19 ll mxf=0;
20 bool gtcc(int x,int y){
21     stck[++tp]=x;
22     if(vstd[x]){
23         fill(vstd,vstd+1+n,false);
24         do vstd[ccd[++cct]=stck[tp]]=true,ccv[cct]=fthv[stck[tp--]];while(stck[tp]!=x);
25         return true;}
26     vstd[x]=true;
27     for(int i=lk[x];i;i=e[i].nxt)if(e[i].y!=y){
28         fthv[e[i].y]=e[i].v;
29         if(gtcc(e[i].y,x))  return true;}
30     --tp;
31     return false;}
32 void gtdp(int x,int y){
33     for(int i=lk[x];i;i=e[i].nxt)if(e[i].y!=y && !vstd[e[i].y]){
34         dp[e[i].y]=dp[x]+e[i].v,gtdp(e[i].y,x);
35         mxf=max(mxf,f[x]+f[e[i].y]+e[i].v);
36         f[x]=max(f[x],f[e[i].y]+e[i].v);}}
37 int main(){//freopen("ddd.in","r",stdin);
38     int l,r,z;  cin>>n;
39     for(int i=1;i<=n;++i)  l=rd(),r=rd(),z=rd(),ist(l,r,z),ist(r,l,z);
40     if(!gtcc(1,0))  return 0;
41     for(int i=1;i<=cct;++i)  gtdp(ccd[i],0);
42     ll bwl=0,mx=0,ans=0,tt=ccv[cct],tmp;  ccv[cct]=0;
43     for(int i=1;i<=cct;++i){
44         bwl+=ccv[i-1];
45         f1[i]=max(f1[i-1],bwl+f[ccd[i]]);
46         f2[i]=max(f2[i-1],mx+bwl+f[ccd[i]]);
47         mx=max(mx,f[ccd[i]]-bwl);}
48     bwl=mx=0;
49     for(int i=cct;i>=1;--i){
50         bwl+=ccv[i];
51         f3[i]=max(f3[i+1],bwl+f[ccd[i]]);
52         f4[i]=max(f4[i+1],mx+bwl+f[ccd[i]]);
53         mx=max(mx,f[ccd[i]]-bwl);}
54     ans=f2[cct];
55     for(int i=1;i<cct;++i){
56         tmp=max(f1[i]+f3[i+1]+tt,max(f2[i],f4[i+1]));
57         ans=min(ans,tmp);}
58     ans=max(ans,mxf);
59     printf("%.1lf\n",ans*1.0/2);
60     return 0;}

View Code

转载于:https://www.cnblogs.com/JSL2018/p/6895415.html

【BZOJ3242】【UOJ#126】【NOI2013】快餐店相关推荐

  1. NOI2013 快餐店

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

  2. [BZOJ3242][Noi2013]快餐店 环套树+线段树

    如果给的是一棵树那么答案显然是直径/2 但是现在给的是一个环套树 那你就枚举一下环上的每条边把它删掉再求直径就好辣(显然你不会走环上的某一条边 这很显然吧- - ) 然后你就要求剩下来的这棵树的直径 ...

  3. [NOI2013]快餐店

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

  4. bzoj 3242: [Noi2013]快餐店

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

  5. NOI2013快餐店【图上找环+线段树】

    NOI 2013 快餐店 NOI 线段树 题目传送点 说白了,就是给个N个点N条边的图,然后求一个点(不一定是给的那N个点),到所有给定的点的路程最大值最小 =≡Σ((( つ•̀ω•́)つ我是蒟蒻,想 ...

  6. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  7. NOI2010~NOI2018选做

    [NOI2010] [NOI2010]海拔 高度只需要0/1,所以一个合法方案就是一个割,平面图求最小割. [NOI2010]航空管制 反序拓扑排序,每次取出第一类限制最大的放置,这样做答案不会更劣. ...

  8. 【NOI2013】快餐店【基环树】【树的直径】【set】

    传送门 题意:给一棵nnn个点的基环树,找一个点(可以在边上),求所有节点到这个点的最大值的最小值. n≤1e5n \leq1e5n≤1e5 先考虑一棵普通树的情况 显然是直径长度的一半 因为如果有个 ...

  9. P1397 [NOI2013] 矩阵游戏(矩阵乘法欧拉定理)

    P1397 [NOI2013] 矩阵游戏(矩阵乘法&欧拉定理) #include<bits/stdc++.h> using namespace std; typedef long ...

最新文章

  1. 利用Scala特征(trait)的堆叠操作特性进行切面编程
  2. http请求之get和post的区别
  3. linux学习总结--linux100day(day1)
  4. 【Transformer】Are Transformers More Robust Than CNNs?
  5. CSAcademy Or Problem
  6. 数字信号处理基础知识00
  7. Java 面向对象:instanceof和类型转换的理解
  8. 公司“凉凉”都怪大楼风水?望京SOHO诉自媒体案正式开庭
  9. 谷歌CEO皮猜:我们想服务中国用户,但是没想好提供何种服务
  10. Harmony OS — PageSlider滑动页面
  11. 极限压缩----压缩至原视频的五分之一
  12. Anaconda版本与Python版本对应关系
  13. python函数_列表入门
  14. UITextView内边距设置
  15. 打不死的小强(找实习面试篇)
  16. 1997-2020年31省进出口总额
  17. 10本 JavaScript PDF 书籍免费分享
  18. 如何做好“强势型”领导的向上管理?
  19. java手机游戏开发如何_用JAVA开发手机游戏需要如何构建开发环境?
  20. 15篇大数据精品文章大合集

热门文章

  1. 谷歌chrome浏览器的源码分析(七)
  2. 局部敏感哈希-Locality Sensitive Hashing
  3. 图像处理(十二)图像融合(1)Seamless cloning泊松克隆-Siggraph 2004
  4. A Scala Tutorial for Java Programmers
  5. 【OpenCV3】直线拟合——cv::fitLine()详解
  6. Python Argparse模块
  7. Script:GridControl Repository Health Check
  8. UVA10305 Ordering Tasks
  9. topcoder srm 711 div1 -3
  10. spring事务配置