CF101D Castle
首先,一定要把所有点遍历一遍,这时答案应该是\(\frac{\sum 某个点第一次被遍历的时间点}{n-1}\quad\),而且每条边只能走两次,所以每次要遍历完某棵子树才能遍历其它子树。
考虑每次先递归处理子树,记\(f_x=\sum x子树内某个点第一次被遍历的时间点,g_x=w_{x,fa_x}+\sum x 子树内边权\)
显然\(g_x=\sum_{y是x的儿子\quad}g_y\) ; \(f_x\)的话,因为要将儿子以一定顺序遍历,因此某个儿子的贡献应该是\(f_y+sz_y*(w_{(x,y)}+pre)(pre=\sum前面的g_y*2)\)
我们要使得答案最小,先考虑只有两个儿子\(a,b\),如果儿子\(a\)在前面,$$f_x=f_a+sz_aw_{(x,a)}+f_b+sz_b(w_{(x,b)}+g_a2)$$,如果是\(b\)在前,则为$$f_x=f_b+sz_bw_{(x,b)}+f_a+sz_a(w_{(x,a)}+g_b2)$$现在如果\(a\)在前面答案更小,则$$f_a+sz_aw_{(x,a)}+f_b+sz_b(w_{(x,b)}+g_a2)<f_b+sz_bw_{(x,b)}+f_a+sz_a(w_{(x,a)}+g_b2)$$$$sz_aw_{(x,a)}+sz_b(w_{(x,b)}+g_a2)<sz_bw_{(x,b)}+sz_a(w_{(x,a)}+g_b2)$$$$sz_bg_a2<sz_ag_b2$$$$\frac{g_a}{sz_a}<\frac{g_b}{sz_b}$$
然后进行推广,把上式作为排序优先级,排序后做就能得出最终答案了
#include<bits/stdc++.h>
#define il inline
#define re register
#define LL long long
#define db double
#define eps (1e-7)
using namespace std;
const int N=500000+10;
il LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
db w[N<<1];
int to[N<<1],nt[N<<1],hd[N],tot=1;
il void add(int x,int y,int z)
{
++tot,to[tot]=y,nt[tot]=hd[x],w[tot]=z,hd[x]=tot;
++tot,to[tot]=x,nt[tot]=hd[y],w[tot]=z,hd[y]=tot;
}
int n;
struct nn
{
db x,y,z;
bool operator < (const nn &bb) const {return z/y!=bb.z/bb.y?z/y<bb.z/bb.y:z<bb.z;}
}st[N];
db f[N],g[N],sz[N];
void dfs(int x,int ffa)
{
sz[x]=1;
for(int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y==ffa) continue;
dfs(y,x);
sz[x]+=sz[y];
}
int tt=0;
for(int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y==ffa) continue;
st[++tt]=(nn){f[y]+sz[y]*w[i],sz[y],g[y]+w[i]};
}
sort(st+1,st+tt+1);
for(int i=1;i<=tt;i++)
{
f[x]+=st[i].x+st[i].y*g[x]*2;
g[x]+=st[i].z;
}
}
int main()
{
n=rd();
for(int i=1;i<n;i++)
{
int x=rd(),y=rd(),z=rd();
add(x,y,z);
}
dfs(1,0);
printf("%.8lf\n",f[1]/(db)(n-1));
return 0;
}
CF101D Castle的更多相关文章
- 题解-CF101D Castle
题面 CF101D Castle 给一棵 \(n\) 个节点的带权树,求一种遍历方案,从 \(1\) 出发,每条边走两次,走过所有点,第一次经过每个节点的平均时间最小.输出这个平均时间. 数据范围:\ ...
- CF101D Castle 树形DP、贪心
题目传送门 题意:给出一个有$N$个点的树,你最开始在$1$号点,经过第$i$条边需要花费$w_i$的时间.每条边只能被经过$2$次.求出到达除$1$号点外所有点的最早时间的最小平均值.$N \leq ...
- Castle Core 4.0.0 alpha001发布
时隔一年多以后Castle 项目又开始活跃,最近刚发布了Castle Core 4.0.0 的alpha版本, https://github.com/castleproject/Core/releas ...
- 对Castle Windsor的Resolve方法的解析时new对象的探讨
依赖注入框架Castle Windsor从容器里解析一个实例时(也就是调用Resolve方法),是通过调用待解析对象的构造函数new一个对象并返回,那么问题是:它是调用哪个构造函数呢? 无参的构造函数 ...
- AOP之Castle DynamicProxy 动态代理
这里主要介绍使用castle这个动态代理,在.net一些开源的框架里可以找到它的影子,就连微软的rchard也是使用这个进行方法拦截等可以基于这个进行方法拦截,在这个方面PostSharp算是比较好用 ...
- ASP.NET Core 整合Autofac和Castle实现自动AOP拦截
前言: 除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninject和Castle). 1.ASP ...
- MVC Castle依赖注入实现代码
1.MVc 实现依赖注入 public class WindsorControllerFactory : DefaultControllerFactory { private readonly IKe ...
- 避免Castle Windsor引起的内存泄露
原文地址: http://nexussharp.wordpress.com/2012/04/21/castle-windsor-avoid-memory-leaks-by-learning-the-u ...
- Castle中AdditionalInterfaces用法介绍
首先见下图(图一),其中FooController是一个没有实现任何Interface的空类.需要实现的效果是:通过FooController对象调用FooService的Do方法.设置这一不常见的场 ...
随机推荐
- Jenkins中使用GitLab的配置
1. 概述 在Jenkins中从GitLab上拉取代码进行打包或测试. 2. 安装 Jenkins和GitLab默认已经安装好,安装过程此处不再赘述. 在Jenkins上安装Git和Gitlab插件, ...
- BZOJ3526[Poi2014]Card——线段树合并
题目描述 有n张卡片在桌上一字排开,每张卡片上有两个数,第i张卡片上,正面的数为a[i],反面的数为b[i].现在,有m个熊孩子来破坏你的卡片了!第i个熊孩子会交换c[i]和d[i]两个位置上的卡片. ...
- jsp操作MySQL时报错:Operation not allowed after ResultSet closed
一个stmt对多个rs进行操作引起的ResultSet关闭的错误 解决办法:创建新的stmt,一个rs对应一个stmt
- 洛谷P3085 [USACO13OPEN]阴和阳Yin and Yang(点分治,树上差分)
洛谷题目传送门 闲话 偶然翻到一道没有题解的淀粉质,想证明一下自己是真的弱 然而ZSYC(字符串组合)早就切了 然后证明成功了,WA到怀疑人生,只好借着ZSY的代码拍,拍了几万组就出来了... 思路 ...
- Shell基础知识(六)
shell中有很多内建命令,如何区分内建命令与外部文件,使用type command即可看到命令类型. >> type cd # input << cd is a Shell ...
- 倒置输入的整数(C、Python)
C语言: # include <stdio.h> void f(int num) { , j=, yu; printf("转置后:"); ) { yu = num ...
- [SDOI2016]储能表——数位DP
挺隐蔽的数位DP.少见 其实减到0不减了挺难处理.....然后就懵了. 其实换个思路: xor小于k的哪些都没了, 只要留下(i^j)大于等于k的那些数的和以及个数, 和-个数*k就是答案 数位DP即 ...
- springboot 读取 resource文件
文件位置信息如图: import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import ...
- 中南大学2018年ACM暑期集训前期训练题集(入门题) J : A Simple Problem
毒瘤哇!为什么要用long long 啊!!!这个题没有加法操作啊,为什么会爆int啊!!!! 思路: http://www.cnblogs.com/buerdepepeqi/p/9048130.ht ...
- A*算法(附c源码)
关于A*算法网上介绍的有很多,我只是看了之后对这个算法用c写了一下,并测试无误后上传以分享一下,欢迎指正!下面是我找的一个介绍,并主要根据这个实现的. 寻路算法不止 A* 这一种, 还有递归, 非递归 ...