前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >洛谷P1351 联合权值(树形dp)

洛谷P1351 联合权值(树形dp)

作者头像
attack
发布2018-11-09 16:10:02
3050
发布2018-11-09 16:10:02
举报

题意

题目链接

Sol

一道很简单的树形dp,然而被我写的这么长

分别记录下距离为\(1/2\)的点数,权值和,最大值。以及相邻儿子之间的贡献。

树形dp一波。。

#include<bits/stdc++.h>
#define Fin(x) {freopen(x, "r", stdin);}
#define int long long 
using namespace std;
const int MAXN = 2e5 + 10, mod = 10007;
inline int read() {
    char c = getchar(); int x = 0, f = 1;
    while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x * f;
}
int N, a[MAXN];
vector<int> v[MAXN];
int f[MAXN][3], sum[MAXN][3], num[MAXN][3],  dis[MAXN], down[MAXN], Son[MAXN];
int add(int x, int y) {
    if(x + y < 0) return x + y + mod;
    else return x + y >= mod ? x + y - mod : x + y;
}
int mul(int x, int y) {
    return 1ll * x * y % mod;
}
void dfs(int x, int fa) {
    dis[x] = 0;
    for(int i = 0, to; i < v[x].size(); i++) {
        if((to = v[x][i]) == fa) continue;
        dfs(to, x);
        dis[x] = add(dis[x], mul(sum[x][1], a[to]));
        if(!Son[x]) Son[x] = a[to];
        else down[x] = max(down[x], a[to] * Son[x]), Son[x] = max(Son[x], a[to]);
        f[x][1] = max(f[x][1], a[to]);
        f[x][2] = max(f[x][2], f[to][1]);
        sum[x][1] = add(sum[x][1], a[to]);
        sum[x][2] = add(sum[x][2], sum[to][1]);
        num[x][1]++;
        num[x][2] += num[to][1];
    }
}
signed main() {
    memset(f, -1, sizeof(f));
    N = read();
    for(int i = 1; i <= N - 1; i++) {
        int x = read(), y = read();
        v[x].push_back(y); v[y].push_back(x);
    }
    for(int i = 1; i <= N; i++) a[i] = read();
    dfs(1, 0);
    int mx = 0, s = 0;
    for(int i = 1; i <= N; i++) {
        if(~f[i][2]) mx = max(mx, a[i] * f[i][2]);
        if(num[i][2]) s = add(s, mul(a[i], sum[i][2]));
        if(num[i][1] > 1) s = add(s, dis[i]), mx = max(mx, down[i]);
    }
    cout << mx << " " << s * 2 % mod;
    return 0;
}
/*
*/
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题意
  • Sol
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档