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 ...
随机推荐
- 【笔记】GTK的bind函数的参数
自打用了cinnamon之后 无比想念gnome的扩展 虽然都是基于gjs的东西 但是gnome的插件在cinnamon上没有就很痛苦 这次修改了个插件 recents 记录历史打开的文件 想添加个功 ...
- 使用python启动appium(虚拟器)
1.先安装各种库 https://www.cnblogs.com/zhanglingling00/p/14169462.html pip install Appium-Flutter-Finder p ...
- AWS RedShift实战应用SQL大全及经验分享[持续更新]
文章目录 前言 - 关于RedShift 一.数据维护篇 1.1 表结构操作 1.2 数据添加与查询 1.3 数据修改与删除 1.4 事物操作 二.SQL结构篇 2.1 使用with封装代码 2.2 ...
- :)模型保存为单一个pb文件
模型保存为单一个pb文件 背景 参考连接: https://www.yuque.com/g/jesse-ztr2k/nkke46/ss4rlv/collaborator/join?token=XUVZ ...
- wpf TreeView右键选中节点弹菜单
<TreeView x:Name="CustomTreeView" Canvas.Top="1" Canvas.Bottom="1" ...
- k8s_使用k8s部署博客系统deployment(四)
mysql deployment 前面的nfs pv pvc secret configmap service等k8s对象已经创建好了,准备工作已经完成:现在可以开始准备deployment配置文件 ...
- mysql命令行如何执行sql脚本
本文介绍在windows操作系统和Linux操作系统中,如何在命令界面模式下执行对应的sql脚本到mysql数据库 Windows操作系统下 mysql -u root -p db1 < E:\ ...
- sublime 设置快捷键
Tools-> Developer-> New Snippet 打开后保存文件要是以 .sublime-snippet 做结尾 <snippet> <content> ...
- fastadmin添加自定义按钮
问题:关于fastadmin框架列表页面自定义按钮功能 案例:自定义一个同步数据的按钮 <a href="javascript:;" class="btn btn- ...
- Python通过解压ofd文件获取发票信息
实际上ofd.docx.xlsx等文件就是一个压缩文件,是可以被解压处理的.所以我们把一个ofd格式的发票文件解压后就可以看到它的目录,如下: 再用谷歌或者IE打开里面的xml属性的文件,就可以看到发 ...