博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
83: 模拟赛 树形dp
阅读量:5088 次
发布时间:2019-06-13

本文共 2906 字,大约阅读时间需要 9 分钟。

$des$

$sol$

维护每个点的子树中的信息以及非子树的信息

$code$

#include 
using namespace std;#define gc getchar()inline int read() { int x = 0; char c = gc; while(c < '0' || c > '9') c = gc; while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = gc; return x;}#define Rep(i, a, b) for(int i = a; i <= b; i ++)const int N = 1e5 + 10;int f[N][3], g[N][3];int n, p;int deep[N], fa[N], size[N][2], sizeg[N][3];struct Node { int v, w, nxt;} G[N << 1];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 + 1); }}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 % 2) { size[u][0] += size[v][1]; size[u][1] += size[v][0]; size[u][1] ++; f[u][0] += f[v][1] + w * size[v][1]; f[u][1] += f[v][0] + w * size[v][0] + w; } else { size[u][0] += size[v][0]; size[u][1] += size[v][1]; size[u][0] ++; f[u][0] += f[v][0] + w * size[v][0] + w; f[u][1] += f[v][1] + w * size[v][1]; } }}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 % 2) { sizeg[v][1] ++; sizeg[v][1] += sizeg[u][0] + size[u][0] - size[v][1]; sizeg[v][0] += sizeg[u][1] + size[u][1] - size[v][0] - 1; g[v][1] += g[u][0] + (f[u][0] - f[v][1]) - size[v][1] * w; g[v][1] += w * (sizeg[u][0] + size[u][0] - size[v][1] + 1); g[v][0] += g[u][1] + (f[u][1] - f[v][0]) - size[v][0] * w - w; g[v][0] += w * (sizeg[u][1] + size[u][1] - size[v][0] - 1); } else { sizeg[v][0] ++; sizeg[v][1] += sizeg[u][1] + size[u][1] - size[v][1]; sizeg[v][0] += sizeg[u][0] + size[u][0] - size[v][0] - 1; g[v][1] += g[u][1] + (f[u][1] - f[v][1]) - size[v][1] * w; g[v][1] += w * (sizeg[u][1] + size[u][1] - size[v][1]); g[v][0] += g[u][0] + (f[u][0] - f[v][0]) - size[v][0] * w - w; g[v][0] += w * (sizeg[u][0] + size[u][0] - size[v][0] + 1 - 1); } Dfs3(v); }}int main() { n = read(), p = read(); Rep(i, 1, n) head[i] = -1; Rep(i, 1, n - 1) { int u = read(), v = read(), w = read(); Link(u, v, w), Link(v, u, w); } Dfs1(1, 0, 1); Dfs2(1); Dfs3(1); Rep(pp, 1, p) { int x = read(); int j = f[x][1] + g[x][1]; int o = f[x][0] + g[x][0]; cout << j << " " << o << "\n"; } return 0;}

 

转载于:https://www.cnblogs.com/shandongs1/p/9849813.html

你可能感兴趣的文章
Picture poj1177
查看>>
时区间时间的转换 1152
查看>>
1020 导弹拦截
查看>>
Android菜单详解(五)——使用XML生成菜单
查看>>
iCheck:超级精美的自定义复选框 & 单选按钮
查看>>
10套免费的 Photoshop UI 元素以及 PSD 素材
查看>>
在Linux上安装Git
查看>>
Android显示GIF动画完整示例(一)
查看>>
(图解)情景化知识管理 --- 第三代知识管理典型实践
查看>>
Loadrunner11 安装、破解、汉化的完整安装
查看>>
c++ 带中文汉字的字符串截取
查看>>
OpenCV特征点提取----Fast特征
查看>>
Elasticsearch 优化
查看>>
开发安卓app配置
查看>>
Scala基础知识(二)
查看>>
Python:游戏:300行代码实现俄罗斯方块
查看>>
fedora22 无法联网的情况下rpm安装gcc5.1
查看>>
cocos2dx - 在MFC中使用cocos2dx
查看>>
网络通信协议之ICMP
查看>>
Oracle+Ado.Net(二)
查看>>