2020ccpc威海C.Rencontre题解(树形dp)
题目大意:给定一棵带边权树,给三份点的集合U1,U2,U3,求0.5*(E(dis(u1,u2))+E(dis(u1,u3))+E(dis(u2,u3))).
即,我们需要维护两份点的所有距离和。显然,如果用lca处理会超时,于是我们考虑使用树形dp进行处理。对每条边,我们考虑删除它的代价为它所链接的两个连通分量的不同颜色的数量的积乘以该边权。那么直接用树形dp维护即可。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read(){
ll x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int maxn=(2e5)+5;
struct node{
int to,w;
};
bool che[4][maxn];
ll cnt[3];
vector<node>g[maxn];
ll siz[4][maxn];
bool vis1[maxn];
void dfs1(int u){
vis1[u]=1;
for(int i=1;i<=3;i++){
if(che[i][u])siz[i][u]=1;
}
for(int i=0;i<g[u].size();i++){
int v=g[u][i].to;
if(!vis1[v]){
dfs1(v);
for(int j=1;j<=3;j++)siz[j][u]+=siz[j][v];
}
}
}
bool vis2[maxn];
double ans=0;
void dfs2(int u){
vis2[u]=1;
for(int i=0;i<g[u].size();i++){
int v=g[u][i].to;
int w=g[u][i].w;
if(!vis2[v]){
dfs2(v);
for(int j=1;j<=3;j++){
for(int k=1;k<=3;k++){
if(j!=k)ans+=1.0*siz[j][v]*(cnt[k]-siz[k][v])*w/(cnt[k]*cnt[j]*1.0);
}
}
}
}
}
int main(){
int n=read();
for(int i=1;i<n;i++){
int u=read();
int v=read();
int w=read();
g[u].push_back(node{v,w});
g[v].push_back(node{u,w});
}
for(int i=1;i<=3;i++){
ll m=read();
cnt[i]=m;
for(int j=1;j<=m;j++){
ll x=read();
che[i][x]=1;
}
}
dfs1(1);
dfs2(1);
printf("%.11lf\n",ans/2.0);
return 0;
}
2020ccpc威海C.Rencontre题解(树形dp)的更多相关文章
- Codeforces Round #384 (Div. 2)D - Chloe and pleasant prizes 树形dp
D - Chloe and pleasant prizes 链接 http://codeforces.com/contest/743/problem/D 题面 Generous sponsors of ...
- codeforces 161D Distance in Tree 树形dp
题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...
- BNUOJ 52305 Around the World 树形dp
题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...
- 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索
题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...
- 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心
题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...
- 【bzoj1304】[CQOI2009]叶子的染色 树形dp
题目描述 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点( ...
- 【bzoj1596】[Usaco2008 Jan]电话网络 树形dp
题目描述 Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流.不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上无线电通讯塔,来 ...
- 【bzoj2591】[Usaco 2012 Feb]Nearby Cows 树形dp
题目描述 Farmer John has noticed that his cows often move between nearby fields. Taking this into accoun ...
- 【bzoj1131】[POI2008]Sta 树形dp
题目描述 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 输入 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. 输出 输出你所找到的点,如果具有 ...
- 【bzoj1369】[Baltic2003]Gem 树形dp
题目描述 给出一棵树,要求你为树上的结点标上权值,权值可以是任意的正整数 唯一的限制条件是相临的两个结点不能标上相同的权值,要求一种方案,使得整棵树的总价值最小. 输入 先给出一个数字N,代表树上有N ...
随机推荐
- python 第三方包大全
https://www.lfd.uci.edu/~gohlke/pythonlibs/ http://mirrors.aliyun.com/pypi/simple
- NLB+ARR实现IIS下的高可用性负载均衡
NLB+ARR实现IIS下的高可用性负载均衡 场景: 高可用/可伸缩集群: NLB部署: 很简单, 暂略. 3.ARR部署 ARR全称叫Application Request Router, 是I ...
- 【TensorFlow】Tensorflow-GPU 环境搭建教程(附 Windows 版本对应表及 CUDA GPU 计算能力表)
conda教程(推荐):『Tensorflow GPU Installation Made Easy: Use conda instead of pip [Update-2] | by Harveen ...
- Python游戏开发常用库
PyWeek:编程挑战,主要是Python游戏开发方面的 PyGame:PyGame在优秀的SDL库之上添加了更多功能.允许使用python语言创建功能齐全的游戏和多媒体程序.具有高度的可移植性,几乎 ...
- .Net Core WebApi + Vue前后端分离项目中的jwt令牌应用
1.Start up 里面配置JWT认证方案 //认证方案 services.AddAuthentication(option => { option.DefaultAuthenticateSc ...
- dynamics 365 复制(克隆)现有组织
很多时候需要复制现有的开发环境作为新的开发环境,以保留原有测试数据,旧的开发环境作为问题修复环境,以下是复制步骤: 1. 登录数据库服务器,备份现有数据库 2. 还原数据库为新的数据库名称 3. 在前 ...
- 清理缓存tc
/$SYNC 今天修改自建表的字段,换了参考字段但是SE16N显示一直没有改变,删字段,删表都尝试依旧无果,实际上只是没有清理缓存,扑街,留存
- CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
1.npm install -g increase-memory-limit 2.increase-memory-limit 3.重启解决
- el-scrollbar 饿了么滚动条不出现 bug
el-scrollbar 饿了么滚动条不出现 bug 解决方法:el-scrollbar 的直接子元素样式需要设置为 display: inline-block;
- 杭电oj 求奇数的乘积
#include <stdio.h> #include <stdlib.h> int main() { int i,n,a; int sum = 1; while(scanf( ...