当前位置: 首页 > news >正文

【bzoj1758】[Wc2010]重建计划

Description

Input

第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai,Bi,Vi分别表示道路(Ai,Bi),其价值为Vi 其中城市由1..N进行标号

Output

输出最大平均估值,保留三位小数

Sample Input

4
2 3
1 2 1
1 3 2
1 4 3

Sample Output

2.500

HINT

N<=100000,1<=L<=U<=N-1,Vi<=1000000 新加数据一组 By leoly,但未重测..2016.9.27

题解:

  好一个扫把树……长见识长见识。

  显然二分答案+树的点分治。每次遍历一棵子树来得到$dis$数组,表示同一路径数的最大权值,然后再存一个之前遍历子树的桶,含义与$dis$一样,但是要注意从小到大处理每棵子树。扫把树……卡死人。

  顺便一提,bzoj不会爆栈。

  (空行比较多,所以显得很长……)

 

  1 #define Troy 09/30/2017
  2  
  3 #define inf 0x7fffffff
  4  
  5 #include <bits/stdc++.h>
  6  
  7 using namespace std;
  8  
  9 typedef long long ll;
 10  
 11 const int N=500100;
 12 const double eps=1e-4;
 13  
 14 inline int read(){
 15     int s=0,k=1;char ch=getchar();
 16     while(ch<'0'|ch>'9')  ch=='-'?k=-1:0,ch=getchar();
 17     while(ch>47&ch<='9')  s=s*10+(ch^48),ch=getchar();
 18     return s*k;
 19 }
 20  
 21 struct edges{
 22     int v;ll w;edges *last;
 23 }edge[N<<1],*head[N];int cnt;
 24  
 25 inline void push(int u,int v,ll w){
 26     edge[++cnt]=(edges){v,w,head[u]};head[u]=edge+cnt;
 27 }
 28  
 29 int n,up,low,tot,top,root,size[N],heavy[N],T[N],Tdis[N],part,from;
 30 ll t[N],dis[N];
 31 bool vis[N];
 32 double ans,maxr;
 33  
 34 inline void dfs(int x,int fa,int deep){
 35     size[x]=1;
 36     heavy[x]=0;
 37     for(edges *i=head[x];i;i=i->last)if(i->v!=fa&&(!vis[i->v])){
 38         dfs(i->v,x,deep+1);
 39         size[x]+=size[i->v];
 40         heavy[x]=max(size[i->v],heavy[x]);
 41     }
 42     heavy[x]=max(heavy[x],tot-size[x]);
 43     if(heavy[x]<top) 
 44         top=heavy[x],root=x;
 45 }
 46  
 47 inline void calc(int x,int fa,ll d,int lens){
 48     if(lens>up)  return ;
 49     if(Tdis[lens]!=part){
 50         Tdis[lens]=part;
 51         dis[lens]=d;
 52     }else
 53         dis[lens]=max(dis[lens],d);
 54     for(edges *i=head[x];i;i=i->last)    if(i->v!=fa&&(!vis[i->v])){
 55         calc(i->v,x,d+i->w,lens+1);
 56     }
 57 }
 58  
 59 inline void get_new(int x,int fa,ll d,int lens){
 60     if(lens>up)  return;
 61     if(T[lens]!=T[0])
 62         T[lens]=T[0],t[lens]=d;
 63     else   
 64         t[lens]=max(t[lens],d);
 65     from=max(from,lens);
 66     for(edges *i=head[x];i;i=i->last)    if(i->v!=fa&&(!vis[i->v])){
 67         get_new(i->v,x,d+i->w,lens+1);
 68     }
 69 }
 70  
 71 int q[N];
 72 double nq[N];
 73  
 74 inline bool Judge(double x){
 75     int l=0,r=0;
 76     int pos=min(up-1,from);
 77     bool flag=1;
 78     while(pos>=low){
 79         if(T[pos]!=T[0]){   
 80             pos--;continue;
 81         }
 82         while(r>l&&nq[r-1]<t[pos]-x*pos)
 83             r--;
 84         nq[r]=t[pos]-x*pos;
 85         q[r++]=pos;
 86         pos--;
 87     }
 88     for(int i=low-pos;i<=up;i++){
 89         if(Tdis[i]!=part)   break;
 90         if(pos>=0&&i+pos>=low&&T[pos]==T[0]){
 91             while(r>l&&nq[r-1]<t[pos]-x*pos)
 92                 r--;
 93             nq[r]=t[pos]-x*pos;
 94             q[r++]=pos;
 95         }
 96         while(l<r&&q[l]+i>up)
 97             l++;
 98         pos--;
 99         if(l<r&&nq[l]+dis[i]-i*x>=0)
100             return true;
101     }
102     return false;
103 }
104  
105 struct node{
106     int v,w;
107     friend bool operator <(node x,node y){
108         return size[x.v]<size[y.v];
109     }
110 }sons[N];
111  
112  
113 inline void solve(int u){
114     tot=size[u];
115     top=inf;
116     dfs(u,u,0);
117     vis[root]=true;
118     T[0]++;
119     from=1;
120     int cc=0;
121     for(edges *i=head[root];i;i=i->last)if(!vis[i->v]){
122         cc++;
123         sons[cc].v=i->v;
124         sons[cc].w=i->w;
125     }
126     sort(sons+1,sons+1+cc);
127     for(int i=1;i<=cc;i++){
128         if(i>1){
129                 part++;
130                 calc(sons[i].v,0,sons[i].w,1);
131                 double l=ans,r=maxr,mid;
132                 while(l<r-eps){
133                     mid=(l+r)/2;                
134                     if(Judge(mid))  l=mid;
135                     else    r=mid;
136                 }
137                 ans=l;
138             }
139             if(i<cc)
140                 get_new(sons[i].v,0,sons[i].w,1);
141     }
142     for(edges *i=head[root];i;i=i->last) if(!vis[i->v])
143         solve(i->v);
144 }
145  
146 int main(){
147     n=read();
148     low=read(),up=read();
149     for(int i=1,u,v,w;i<n;i++){
150         u=read(),v=read(),w=read();
151         push(u,v,w),push(v,u,w);
152         maxr=max(maxr,w+0.0);
153     }
154     size[1]=n;
155     solve(1);
156     printf("%.3lf\n",ans);
157 }

 

 

 

 

转载于:https://www.cnblogs.com/Troywar/p/7614422.html

相关文章:

  • ros 如何使用 openni2_launch
  • Git应用实践(二)
  • 软件项目管理第2次作业:豆瓣测评
  • 【个人训练】(POJ1276)Cash Machine
  • [转] logback 常用配置详解(序)logback 简介
  • 网络视频监控与人脸识别
  • 混合和过度绘制(图层性能 15.3)
  • 【u235】背单词
  • [置顶] 九月半集训总结
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • IntelliJ IDEA之版本控制
  • 【Python】【正则】
  • SharePoint REST API - 使用REST API和jQuery上传一个文件
  • localStorage小结
  • scrum学习心得
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 2017-08-04 前端日报
  • Apache的80端口被占用以及访问时报错403
  • Git初体验
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • HTTP中的ETag在移动客户端的应用
  • oschina
  • Vue全家桶实现一个Web App
  • 来,膜拜下android roadmap,强大的执行力
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 详解NodeJs流之一
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • !!java web学习笔记(一到五)
  • # Java NIO(一)FileChannel
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • $().each和$.each的区别
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (BFS)hdoj2377-Bus Pass
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (四) 虚拟摄像头vivi体验
  • (五)关系数据库标准语言SQL
  • (转)原始图像数据和PDF中的图像数据
  • .NET Core 中插件式开发实现
  • .NET多线程执行函数
  • .sdf和.msp文件读取
  • @RequestBody与@ResponseBody的使用
  • [ linux ] linux 命令英文全称及解释
  • [2023-年度总结]凡是过往,皆为序章
  • [383] 赎金信 js
  • [ASP]青辰网络考试管理系统NES X3.5
  • [DEBUG] spring boot-如何处理链接中的空格等特殊字符
  • [flask]http请求//获取请求头信息+客户端信息