83: 模拟赛 树形dp
$des$

$sol$
维护每个点的子树中的信息以及非子树的信息
$code$
#include <bits/stdc++.h> using namespace std; #define gc getchar()
inline int read() {
int x = ; char c = gc;
while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x;
} #define Rep(i, a, b) for(int i = a; i <= b; i ++) const int N = 1e5 + ; int f[N][], g[N][];
int n, p;
int deep[N], fa[N], size[N][], sizeg[N][]; struct Node {
int v, w, nxt;
} G[N << ];
int cnt, head[N]; void Link(int u, int v, int w) {
G[++ cnt].v = v, G[cnt].w = w, G[cnt].nxt = head[u]; head[u] = cnt;
} void Dfs1(int u, int f_, int dep) {
deep[u] = dep, fa[u] = f_;
for(int i = head[u]; ~ i; i = G[i].nxt) {
int v = G[i].v;
if(v == f_) continue;
Dfs1(v, u, dep + );
}
} void Dfs2(int u) {
for(int i = head[u]; ~ i; i = G[i].nxt) {
int v = G[i].v, w = G[i].w;
if(v == fa[u]) continue;
Dfs2(v);
if(w % ) {
size[u][] += size[v][];
size[u][] += size[v][];
size[u][] ++;
f[u][] += f[v][] + w * size[v][];
f[u][] += f[v][] + w * size[v][] + w;
} else {
size[u][] += size[v][];
size[u][] += size[v][];
size[u][] ++;
f[u][] += f[v][] + w * size[v][] + w;
f[u][] += f[v][] + w * size[v][];
}
}
} void Dfs3(int u) {
for(int i = head[u]; ~ i; i = G[i].nxt) {
int v = G[i].v, w = G[i].w;
if(v == fa[u]) continue;
if(w % ) {
sizeg[v][] ++;
sizeg[v][] += sizeg[u][] + size[u][] - size[v][];
sizeg[v][] += sizeg[u][] + size[u][] - size[v][] - ;
g[v][] += g[u][] + (f[u][] - f[v][]) - size[v][] * w;
g[v][] += w * (sizeg[u][] + size[u][] - size[v][] + );
g[v][] += g[u][] + (f[u][] - f[v][]) - size[v][] * w - w;
g[v][] += w * (sizeg[u][] + size[u][] - size[v][] - );
} else {
sizeg[v][] ++;
sizeg[v][] += sizeg[u][] + size[u][] - size[v][];
sizeg[v][] += sizeg[u][] + size[u][] - size[v][] - ;
g[v][] += g[u][] + (f[u][] - f[v][]) - size[v][] * w;
g[v][] += w * (sizeg[u][] + size[u][] - size[v][]);
g[v][] += g[u][] + (f[u][] - f[v][]) - size[v][] * w - w;
g[v][] += w * (sizeg[u][] + size[u][] - size[v][] + - );
}
Dfs3(v);
}
} int main() {
n = read(), p = read();
Rep(i, , n) head[i] = -;
Rep(i, , n - ) {
int u = read(), v = read(), w = read();
Link(u, v, w), Link(v, u, w);
}
Dfs1(, , );
Dfs2();
Dfs3();
Rep(pp, , p) {
int x = read();
int j = f[x][] + g[x][];
int o = f[x][] + g[x][];
cout << j << " " << o << "\n";
} return ;
}
83: 模拟赛 树形dp的更多相关文章
- [10.18模拟赛] 序列 (DP)
[10.18模拟赛] 序列 题目描述 山山有一个整数序列s1,s2,-,sn,其中1≤si≤k. 求出有多少个准确移除m个元素后不同的序列.答案模(1e9+7) 输入 输入包括几个测试用例,并且由文件 ...
- 2019沈阳网赛树形dp
https://nanti.jisuanke.com/t/41403 2019沈阳网络赛D题 树形dp.一棵树,求任意两个点的距离之和.u-v和v-u算两次.两点之间的距离分为三类,模3等于0,1,2 ...
- HDU 6201 2017沈阳网络赛 树形DP或者SPFA最长路
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6201 题意:给出一棵树,每个点有一个权值,代表商品的售价,树上每一条边上也有一个权值,代表从这条边经过 ...
- hdu 4274 2012长春赛区网络赛 树形dp ***
设定每个节点的上限和下限,之后向上更新,判断是否出现矛盾 #include<cstdio> #include<iostream> #include<algorithm&g ...
- 模拟赛20181016 dp
给出1-n的序列插入一个bst: 给出T组询问,包含n,h分别代表点数为n,高度为h的树,求所有插入顺序的合法方案数,模1e9+7 样例输入 1 2 1 样例输出 2 #include<bit ...
- [8.16模拟赛] 玩具 (dp/字符串)
题目描述 儿时的玩具总是使我们留恋,当小皮还是个孩子的时候,对玩具更是情有独钟.小皮是一个兴趣爱好相当广泛且不专一的人,这这让老皮非常地烦恼.也就是说,小皮在不同时刻所想玩的玩具总是会不同,而有心的老 ...
- 放棋游戏(NOIP模拟赛)(DP)
没有原题... 囧.. [问题描述] 游戏规则是这样,有n(1<=n<=100)行格子,第一行由n个格子,第二行有n-1个格子,第三行由n-2个格子,……以此类推,第n行有1个格子.要求再 ...
- 98: 模拟赛-神光 dp
$code$ #include <cstdio> #include <cstring> #include <algorithm> using namespace s ...
- NOIp模拟赛 现实(DP 拓扑)
题目来源:by lzz \(Description\) 给定一张有向图,求对于哪些点,删除它和它的所有连边后,图没有环. \(n\leq 5\times10^5,m\leq 10^6\). \(Sol ...
随机推荐
- wait(),notify(),notifyAll()必须加锁的原因
从语义方面解析为什么需要锁: 1.wait()方法会释放锁,如果没有先获得锁,那么如何释放? 从实际的作用: 为了预防饥饿线程的产生. 原因: // 线程A 的代码 while(!condition) ...
- Unity的学习笔记(向量点乘和叉乘)
public class AngleTest : MonoBehaviour { public GameObject cube; //主要的物体 public GameObject radCube; ...
- Linux 系统中如何进入退出 vim 编辑器
在 Linux 中,vim 编辑器是系统自带的文本编辑器,但要修改某个文本文件,可不是像 Windows 那样操作,更有新手,进入 vi 编辑器后,无法退出以致于强制关机,其实,这个vim(vi)也是 ...
- (转)项目迁移_.NET项目迁移到.NET Core操作指南
原文地址:https://www.cnblogs.com/heyuquan/p/dotnet-migration-to-dotnetcore.html 这篇文章,汇集了大量优秀作者写的关于" ...
- 可拖拽dialog
指令的封装转自https://blog.csdn.net/sinat_21902709/article/details/86545444 可拖拽dialog应用于很多弹出框,所以需要作用于全局 在插件 ...
- sqlite 一些常用的句子
有关SQLITE最完整的操作语句参考资料,应当是官方网址的http://www.sqlite.org/lang.html这个地方. select max(id) from table 取最大id ...
- CSS是什么
css是层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言. CSS不 ...
- 【亲测可行,图片宽度高度自适应】c# Graphics MeasureString精确测量字体宽度
, , ) { int count = number.Length; //需要配置的字段 //Font f = new Font("Microsoft Sans Serif", f ...
- c# Directory类的常用方法
- OpenCV和ffmpeg编码资料分享
本博也是在进行视频转码的学习道路上,也只是菜鸟一枚,收集了大量的资料,想在这和同路人分享一下 在博园里我发表一个JavaCV的随笔,里面介绍了JavaCV这个框架,它整合了OpenCV和ffmpeg等 ...