P3984[WC2010]重建计划
问题描述
输入格式
第一行包含一个正整数N,表示X国的城市个数.
第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限
接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai,Bi,Vi分别表示道路(Ai,Bi),其价值为Vi 其中城市由1..N进行标号
输出格式
输出最大平均估值,保留三位小数
样例输入 1
4
2 3
1 2 1
1 3 2
1 4 3
样例输出 1
2.500
样例输入 2
12
3 5
1 2 804224
1 3 645617
2 4 763931
2 6 744133
2 8 534824
4 5 163318
6 7 421158
6 10 773167
6 11 380598
8 9 639836
9 12 261707
样例输出 2
773841.333
提示
20%的数据,N<=5000
30%的数据,N<=100000,原有方案恰好为一条路径
100%的数据,N<=100000,1<=L<=U<=N-1,Vi<=1000000
题目中要求的东西带了个平均值,不好处理,考虑二分答案,然后将每条边权减去mid,那么原题变成求是否存在一条长度在$[L,R]$之间,且权值和$>=0$的路径。
树上路径问题,考虑点分治,考虑过分治中心的路径,按子树顺序讨论,记录$F[d]$表示当前子树之前的子树深度为$d$的最大路径的权,$G[d]$表示当前子树深度为$d$的路径的最大权,那么可以dp,从小到大枚举d,用$G[d]$与$F[L-d]-F[R-d]$来更新答案,显然可以用单调队列来优化。dp完了之后用$G$更新$F$,继续讨论下一棵子树。
这里理论上需要将子树按照最大深度排序来保证复杂度。具体不好说。
另外需要加上一些剪枝,即当前子树点数小于L就不用分治下去了。
另外,最好每层点分治单独二分,这样会跑得比较快。
但是我就是在外面二分,这样就需要加上一些其他优化才能卡过了,比如找到答案就不继续分治,预处理点分治树而不要每次都重新建立点分治树之类。
总时间复杂度$O(n\log^2n)$
代码:
1 |
|