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 ...
随机推荐
- CMMI-QA工作流程(角色区分)
qa 是如何工作的,如何保证产品质量的? 首先制定质量保证计划->根据过程清单和产品清单对组织级和项目级内容进行检查->不符合项记录在不符合项问题记录表中.反馈项目精力,跟踪问题知道问题解 ...
- CSV文件乱码处理方法
如果csv出现乱码, 直接用记事本打开另存为的格式从utf-8变为ANSI模式即可. 然后再打开
- Flutter 3.+更新记录
Flutter3.3稳定版出来了,于是决定把之前Flutter工程的代码更新下其中里面有些涉及到组件的弃用 在此记录 ElevatedButton 代替了 RaisedButton 为带阴影的悬浮按钮 ...
- shadow-socks 服务器配置
https://msd.misuland.com/pd/2884250034537239234 按照上述教程 使用python3 时 pip3 install 会报错 可以按照如下连接修复 https ...
- 修改文件时mmap如何处理
拷贝二进制(elf)文件 在拷贝二进制文件的时候,如果文件是一个可执行文件,并且有一个进程在运行这个可执行文件,那么拷贝的时候会出现"文本忙"(ETXTBSY)的错误提示,并且拷贝 ...
- 【C++复习】第九章 模板与群体数据(1)
1.例:求绝对值函数的模板 函数重载方便了函数的使用者,开发者还是要写两个函数 模板是用来生成函数的东西 编译器通过推导生成函数: 2.函数模板定义语法 从例题入手,别上来就扣语法 3.例9-1 函数 ...
- 微信小程序引入外部字体(字体图标过大,引入外链)
1.把字体放在服务器上,因为字体图标比较大,小程序只支持2m 2.字体加载 3.检测是否加载成功(可能会存在https和http问题,防止跨域)
- Wps调用dll操作Excel表格转PDF
起始原因:wps编辑创建的文档在microsoft office 中打开,会报内容存在异常是否恢复,因此wps文件被微软设定为破损文件,无法对原有文档进行操作运行,故在此使用wps对Excel进行操作 ...
- Operator包的应用
# -*-coding:utf-8-*- import operator print(operator.add(1,1)) # 加 print(operator.sub(2,1)) #减 ...
- QTreeWidget CSS样式
QTreeWidget{ font: 13pt "楷体"; color: rgb(26, 202, 255); border:1px solid rgb(170, 170, 127 ...