题面

传送门

Sol

题意就是给你一棵树,有边权
求边数在[L,U][L,U][L, U]内的一条路径,使得边权和除以边数最大,输出这个最大值


二分答案+点分治+单调队列
二分一个答案midmidmid,把所有的边权减去这个midmidmid就是checkcheckcheck是否有一条边数满足要求的大于等于零的路径
bfsbfsbfs求出当前每个点到根的disdisdis和deepdeepdeep,使其递增
记录下每个深度最大的disdisdis,维护这个的递减的单调队列即可

注意常数优化!!!

奉上加了一组数据后的TLETLETLE代码供参考加什么数据咯
然后博主不想改

# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
const int _(1e5 + 5);
const double EPS(1e-4);IL int Input(){RG int x = 0, z = 1; RG char c = getchar();for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);return x * z;
}int n, L, U, first[_], cnt, mx[_], root, size[_], vis[_], tot;
int mark[_], tmp, deep[_];
double ans, dis[_], t[_];
struct Edge{int to, w, next;
} edge[_ << 1];
int head, tail, Q[_], deq[_];IL void Add(RG int u, RG int v, RG int w){edge[cnt] = (Edge){v, w, first[u]}, first[u] = cnt++;
}IL void GetRoot(RG int u, RG int ff){size[u] = 1, mx[u] = 0;for(RG int e = first[u]; e != -1; e = edge[e].next){RG int v = edge[e].to;if(vis[v] || v == ff) continue;GetRoot(v, u);size[u] += size[v];mx[u] = max(mx[u], size[v]);}mx[u] = max(mx[u], tot - size[u]);if(mx[u] < mx[root]) root = u;
}IL void Bfs(RG double mid, RG int x){Q[head = tail = 0] = x, mark[x] = 1;while(head <= tail){RG int u = Q[head++];for(RG int e = first[u]; e != -1; e = edge[e].next){RG int v = edge[e].to, w = edge[e].w;if(vis[v] || mark[v]) continue;deep[v] = deep[u] + 1, dis[v] = dis[u] + (double)w - mid;Q[++tail] = v, mark[v] = 1;}}
}IL bool Check(RG double mid, RG int u){RG int maxd = 0, flg = 0; t[0] = 0; for(RG int e = first[u]; e != -1; e = edge[e].next){RG int v = edge[e].to, w = edge[e].w;if(vis[v]) continue;dis[v] = (double)w - mid, deep[v] = 1;Bfs(mid, v);for(RG int i = 0; i <= tail; ++i) mark[Q[i]] = 0;RG int he = 0, ta = -1, j = maxd;for(RG int i = 0; i <= tail; ++i){RG int x = Q[i];while(~j && j + deep[x] >= L){while(he <= ta && t[deq[ta]] < t[j]) --ta;deq[++ta] = j--;}while(he <= ta && deep[x] + deq[he] > U) ++he;if(he <= ta && dis[x] + t[deq[he]] >= 0){flg = 1;break;}}maxd = max(maxd, deep[Q[tail]]);if(flg) break;for(RG int i = 0; i <= tail; ++i){RG int x = Q[i];t[deep[x]] = max(t[deep[x]], dis[x]);}}for(RG int i = 0; i <= maxd; ++i) t[i] = -1e12;return flg;
}IL void Calc(RG int u){RG double l = ans, r = tmp;while(r - l > EPS){RG double mid = (l + r) / 2;if(Check(mid, u)) l = mid;else r = mid;}ans = l;
}IL void Solve(RG int u){vis[u] = 1, Calc(u);for(RG int e = first[u]; e != -1; e = edge[e].next){RG int v = edge[e].to;if(vis[v]) continue;root = 0, tot = size[v];if(tot <= L) continue;GetRoot(v, u), Solve(root);}
}int main(RG int argc, RG char* argv[]){tot = n = Input(), L = Input(), U = Input();for(RG int i = 0; i <= n; ++i) first[i] = -1, t[i] = -1e12;for(RG int i = 1; i < n; ++i){RG int u = Input(), v = Input(), w = Input();Add(u, v, w), Add(v, u, w), tmp = max(tmp, w);}mx[0] = n + 1, GetRoot(1, 0), Solve(root);printf("%.3lf\n", ans);return 0;
}

Bzoj1758: [Wc2010]重建计划相关推荐

  1. bzoj1758 [Wc2010]重建计划

    http://www.elijahqi.win/2018/01/20/bzoj1758/ Description Input 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U, ...

  2. [luogu 4292][bzoj 1758][WC2010] 重建计划(点分治 + dp + 单调队列优化 + 启发式合并)

    [WC2010]重建计划 problem solution code problem 洛谷指路 solution 一看那个道路平均价值的式子:AvgValue=∑e∈Sv(e)∣S∣\text{Avg ...

  3. [Luogu P4292] [BZOJ 1758] [WC2010]重建计划

    BZOJ 传送门 洛谷传送门 题目描述 X国遭受了地震的重创, 导致全国的交通近乎瘫痪,重建家园的计划迫在眉睫.X国由NNN个城市组成, 重建小组提出,仅需建立N−1" role=" ...

  4. 【bzoj1758】[Wc2010]重建计划

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

  5. 点分治问题 ----------- luoguP2942 [WC2010]重建计划 [点分治 + bfs + 单调队列 + 预处理建树 + 二分 + 01分数规划]

    题目链接 解题思路: 1.对于这个Avgvalue=∑e∈sv(e)∣s∣Avgvalue = \frac{\sum_{e\in s}v(e)}{|s|}Avgvalue=∣s∣∑e∈s​v(e)​ ...

  6. 【BZOJ1758】重建计划,点分治+单调队列

    Time:2016.08.21 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: UPD 2017.1.18 之前的思路删掉了,因为写的太烂,纯属放屁 刚刚知道新加了一组数据,所以原先 ...

  7. 1758: [Wc2010]重建计划(TLE)

    链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1758 题解? 首先说明这道题我没过. 那为啥要写题解? 因为我确实写的正解啊. 不就是先二分答 ...

  8. 【WC2010】重建计划(分数规划+长链剖分)

    长链剖分 因为有很多巨佬只是讲了一下大致的做法,并没有详细地解释如何维护,所以就有了这篇题解.巨佬们都不屑于详细写,我太弱了/kk 首先先对原树进行长链剖分. 先讲一些定义: 一条路径的权值和指的是这 ...

  9. 洛谷P4292:重建计划(点分治、单调队列)

    解析 第一眼:Wow这么水的黑?? 然后写了一发二分套线段树的3log代码上去 T到飞起,只有40- 无奈瞅了一眼标签:单调队列 对啊 于是又写了一个上去 20 - 好啊 然后就摆烂了 qwq 果然黑 ...

最新文章

  1. python socket发送组播数据_python3通过udp实现组播数据的发送和接收操作
  2. Android开发之带你轻松集成友盟统计
  3. 【CTR预估】CTR模型如何加入稠密连续型和序列型特征?
  4. 一个div 上下两行_Django 实战 | 搭一个 GitHub 用户展示网站 02
  5. matlab使用tic 和 toc记录程序执行时间
  6. python基础——lambda函数
  7. 5-3 面向可维护性的构造技术
  8. Android FrameWork——Binder机制详解(1)
  9. 【运维安全】-HTTP协议
  10. java jvm bind解决_java web项目启动的时候JVM_Bind,真的是tomcat端口被占用了吗?tomcat不同意...
  11. 站立会议(11月21日)
  12. svn插件说明和安装
  13. 统计分析软件_专业统计分析软件 SPSS 25 来了!手把手教你安装
  14. 小麦颗粒数目matlab,求关于matlab中rice.png图像中的米粒数目的算法
  15. 老版本金蝶迷你版9.1升级到金蝶KIS 13.0,升级错误.
  16. PCB学习(一)——立创EDA边框设置
  17. 计算机病毒及其治疗的教案,计算机病毒教案(公开课)原创配套
  18. android 和 js 之间交互的封装
  19. Pygame实战:家里的小孩数学算数能力很差嘛?别慌—这款“巧算24点小游戏”等你来玩,管用。
  20. Python生成词云的制作

热门文章

  1. android刷机刷系统
  2. python内容推荐理由_好书推荐~第5期 | Python 数据可视化
  3. hbuilder 上传图片 保存图片 拍照 muse ui
  4. Matlab Shannon编码实验
  5. 最新Android 9.0 Pie,你想知道的都在这了
  6. 中国移动部署全球最大OpenStack集群的实践之路
  7. python Process, Pipo进程池管道的理解
  8. VScode+Unity3D的配置
  9. python shutil.move 移动文件
  10. 使用FastReport设计分组汇总及合计报表(图文)