无脑上二分+淀粉质完事了

每个子树算的时候把儿子按照最长路径从小到大依次做,和前面的单调队列算一波,每个儿子的复杂度不超过这个子树大小

  1. // luogu-judger-enable-o2
  2. #include<bits/stdc++.h>
  3. #define il inline
  4. #define vd void
  5. typedef long long ll;
  6. il int gi(){
  7. int x=0,f=1;
  8. char ch=getchar();
  9. while(!isdigit(ch)){
  10. if(ch=='-')f=-1;
  11. ch=getchar();
  12. }
  13. while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
  14. return x*f;
  15. }
  16. int n,L,R;
  17. int fir[100010],dis[200010],nxt[200010],w[200010],id;
  18. il vd link(int a,int b,int c){nxt[++id]=fir[a],fir[a]=id,dis[id]=b,w[id]=c;}
  19. std::vector<std::pair<int,int> >G[100010];std::vector<int>Rt[100010];
  20. int RT;
  21. namespace build{
  22. bool vis[100010];
  23. int siz[100010],f[100010],N,rt;
  24. il vd getrt(int x,int fa=-1){
  25. siz[x]=1;f[x]=0;
  26. for(int i=fir[x];i;i=nxt[i]){
  27. if(dis[i]==fa||vis[dis[i]])continue;
  28. getrt(dis[i],x);
  29. siz[x]+=siz[dis[i]];
  30. f[x]=std::max(f[x],siz[dis[i]]);
  31. }
  32. f[x]=std::max(f[x],N-siz[x]);
  33. if(f[x]<f[rt])rt=x;
  34. }
  35. int maxl[100010];il bool cmp(const std::pair<int,int>&a,const std::pair<int,int>&b){return maxl[a.first]<maxl[b.first];}
  36. il vd dfs(int x,int fa=-1){
  37. maxl[x]=0;
  38. for(int i=fir[x];i;i=nxt[i]){
  39. if(dis[i]==fa||vis[dis[i]])continue;
  40. dfs(dis[i],x);
  41. maxl[x]=std::max(maxl[x],maxl[dis[i]]+1);
  42. }
  43. }
  44. il vd build(int x){
  45. vis[x]=1;
  46. for(int i=fir[x];i;i=nxt[i])if(!vis[dis[i]])G[x].push_back(std::make_pair(dis[i],w[i]));
  47. dfs(x);
  48. std::sort(G[x].begin(),G[x].end(),cmp);
  49. for(int i=0;i<G[x].size();++i){
  50. rt=0;N=siz[G[x][i].first];getrt(G[x][i].first);
  51. Rt[x].push_back(rt);build(rt);
  52. }
  53. }
  54. il vd build(){
  55. rt=0;f[0]=1e9;N=n;getrt(1);
  56. RT=rt;build(rt);
  57. }
  58. }
  59. double mid,res;
  60. namespace dfz{
  61. bool vis[100010];
  62. double f[100010],g[100010];
  63. int que[100010],hd,tl;
  64. int N;
  65. bool flg;
  66. il vd dfs(int x,int fa=-1,int len=0,double sum=0){
  67. if(N<len)g[N=len]=sum;
  68. else g[len]=std::max(g[len],sum);
  69. for(int i=fir[x];i;i=nxt[i]){
  70. if(dis[i]==fa||vis[dis[i]])continue;
  71. dfs(dis[i],x,len+1,sum+w[i]-mid);
  72. }
  73. }
  74. il vd divide(int x){
  75. vis[x]=1;int n=0;f[0]=0;
  76. for(int i=0;i<G[x].size();++i){
  77. N=0;g[0]=0;dfs(G[x][i].first,x,1,G[x][i].second-mid);
  78. hd=tl=0;
  79. for(int j=0,p=n;j<=N;++j){
  80. while(~p&&p+j>=L){
  81. while((hd^tl)&&f[que[tl-1]]<f[p])--tl;
  82. que[tl++]=p--;
  83. }
  84. while((hd^tl)&&que[hd]+j>R)++hd;
  85. if((hd^tl)&&f[que[hd]]+g[j]>0){flg=1;return;}
  86. }
  87. for(int i=0;i<=n;++i)f[i]=std::max(f[i],g[i]);
  88. for(int i=n+1;i<=N;++i)f[i]=g[i];
  89. n=N;
  90. }
  91. for(int i=0;i<Rt[x].size();++i){
  92. divide(Rt[x][i]);
  93. if(flg)return;
  94. }
  95. }
  96. il vd clear(){flg=0;memset(vis,0,sizeof vis);}
  97. }
  98. int main(){
  99. #ifndef ONLINE_JUDGE
  100. freopen("in.in","r",stdin);
  101. freopen("out.out","w",stdout);
  102. #endif
  103. n=gi(),L=gi(),R=gi();
  104. int a,b,c;for(int i=1;i<n;++i)a=gi(),b=gi(),c=gi(),link(a,b,c),link(b,a,c);
  105. build::build();
  106. double l=1,r=1000000;
  107. while(r-l>1e-4){
  108. mid=(l+r)*0.5;
  109. dfz::clear();
  110. dfz::divide(RT);
  111. if(dfz::flg)l=mid;
  112. else r=mid;
  113. }
  114. l=(l+r)*0.5;printf("%.3lf\n",l);
  115. return 0;
  116. }

P4292 [WC2010]重建计划的更多相关文章

  1. 洛谷 P4292 [WC2010]重建计划 解题报告

    P4292 [WC2010]重建计划 题目描述 \(X\)国遭受了地震的重创, 导致全国的交通近乎瘫痪,重建家园的计划迫在眉睫.\(X\)国由\(N\)个城市组成, 重建小组提出,仅需建立\(N-1\ ...

  2. 并不对劲的bzoj1758:p4292:[WC2010]重建计划

    题目大意 \(n\)(\(n\leq10^5\))个点的一棵树,有边权\(w\),给定\(l,r\),求边数在\([l,r]\)中的路径的平均边权的最大值 题解 二分答案,判断时将边权变成\(w-mi ...

  3. BZOJ 1758 / Luogu P4292 [WC2010]重建计划 (分数规划(二分/迭代) + 长链剖分/点分治)

    题意 自己看. 分析 求这个平均值的最大值就是分数规划,二分一下就变成了求一条长度在[L,R]内路径的权值和最大.有淀粉质的做法但是我没写,感觉常数会很大.这道题可以用长链剖分做. 先对树长链剖分. ...

  4. P4292 [WC2010]重建计划 点分治+单调队列

    题目描述 题目传送门 分析 看到比值的形式就想到 \(01分数规划\),二分答案 设当前的值为 \(mids\) 如果存在\(\frac{\sum _{e \in S} v(e)}{|S|} \geq ...

  5. 洛谷 P4292 - [WC2010]重建计划(长链剖分+线段树)

    题面传送门 我!竟!然!独!立!A!C!了!这!道!题!incredible! 首先看到这类最大化某个分式的题目,可以套路地想到分数规划,考虑二分答案 \(mid\) 并检验是否存在合法的 \(S\) ...

  6. BZOJ1758: [Wc2010]重建计划

    题解: 这题我居然做了一星期?... 平均值的极值其实也可以算是一种分数规划,只不过分母上b[i]=1 然后我们就可以二分这个值.类似与 HNOI最小圈 如果没有 链的长度的限制的话,我们直接两遍df ...

  7. [WC2010]重建计划 长链剖分

    [WC2010]重建计划 LG传送门 又一道长链剖分好题. 这题写点分治的人应该比较多吧,但是我太菜了,只会长链剖分. 如果你还不会长链剖分的基本操作,可以看看我的长链剖分总结. 首先一看求平均值最大 ...

  8. bzoj 1758 [Wc2010]重建计划 分数规划+树分治单调队列check

    [Wc2010]重建计划 Time Limit: 40 Sec  Memory Limit: 162 MBSubmit: 4345  Solved: 1054[Submit][Status][Disc ...

  9. bzoj 1758: [Wc2010]重建计划

    Description Input 第 一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案 ...

随机推荐

  1. CSS3 中的 box-sizing属性

    语法: box-sizing: content-text | border-box | inherit; content-box(默认): 宽度和高度分别应用元素的内容框:在宽度和高度之外绘制元素的内 ...

  2. 【Python】爬取网站图片

    import requests import bs4 import urllib.request import urllib import os hdr = {'User-Agent': 'Mozil ...

  3. qtcreator minggw 支持c++11

    pro文件添加 QMAKE_CXXFLAGS += -std=c++11

  4. Git创建本地仓库并推送至远程仓库

    作为一名测试同学,日常工作经常需要checkout研发代码进行code review.自己极少有机会创建仓库,一度以为这是一个非常复杂过程.操作一遍后,发现也不过六个步骤,so,让我们一起揭开这神秘面 ...

  5. 获取本地机器的特征码IP MAC

    using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Ma ...

  6. cent7安装ffmpeg

    FFmpeg是一个领先的多媒体框架工具集,几乎能够对任何格式的音视频文件进行解码,编码,转码,复用,解复用,流式传输,过滤和播放. 不管这些音视频文件所采用的格式是由某些标准委员会,社区还是公司设计的 ...

  7. 4种更快更简单实现Python数据可视化的方法

    数据可视化是数据分析或机器学习项目中十分重要的一环.通常,你需要在项目初期进行探索性的数据分析(EDA),从而对数据有一定的了解,而且创建可视化确实可以使分析的任务更清晰.更容易理解,特别是对于大规模 ...

  8. mysql INSERT的几个语法 IGNORE|REPLACE|LOW_PRIORITY | DELAYED

    INSERT IGNORE 与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据.这样就可以保留 ...

  9. python永久添加第三方模块,PYTHONPATH的设置

    今天用pip安装pymysql后遇到了一个问题,在PyCharm中import pymysql模块时,运行却提示我找不到pymysql mudule 我先考虑的是pymysql没有安装成功,但是cmd ...

  10. 第 15 章 位操作(invert4)

    /*------------------------------------ invert4.c -- 使用位操作显示二进制 ------------------------------------* ...