很妙的一个树形DP问题,简单考虑了一下就过了

https://ac.nowcoder.com/acm/contest/2927/E

主要就是推公式(公式有点长呀)

大概就是这样,其实挺简单的。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 7;
const ll mod = 998244353;
int head[maxn];
int cnt = 1;
ll sum[maxn];
ll son[maxn];
ll dp[maxn]; struct Node {
int p;
int next;
}G[2*maxn];
int n;
void add(int be, int en) {
G[cnt].p = en; G[cnt].next = head[be]; head[be] = cnt;
cnt++;
}
int dfs(int x,int fa) {
son[x] = 1;
for (int i = head[x]; i; i = G[i].next) {
int p = G[i].p;
if (p == fa) continue;
dfs(p, x);
son[x] += son[p];
sum[x] = ( sum[x] + son[p] + sum[p]) % mod;
dp[x] = (dp[x] + dp[p] + 2 * sum[p] + son[p]) % mod;
}
return 0;
} int dfs2(int x, int fa) {
for (int i = head[x]; i; i = G[i].next) {
int p = G[i].p;
if (p == fa) continue; ll ans = ((dp[x] - (dp[p] + 2 * sum[p] + son[p])) % mod + mod) % mod;//dp
//sum
ll cns = ((sum[x] - (sum[p] + son[p])) % mod + mod) % mod; dp[p] = ((dp[p] + ans + 2 * cns + n - son[p]) % mod + mod) % mod;
sum[p] = ((sum[p] + cns + n - son[p]) % mod + mod) % mod; dfs2(p, x);
}
return 0;
}
int main() {
int be, en; scanf("%d", &n);
for (int i = 1; i < n; i++) {
scanf("%d %d", &be, &en);
add(be, en);
add(en, be);
}
dfs(1, -1);
dfs2(1, -1);
ll a = 0; for (int i = 1; i <= n; i++) {
a = (a + dp[i]) % mod;
}
printf("%lld\n", a);
return 0;
}

  

牛客训练赛55 E 树的更多相关文章

  1. 2019牛客训练赛第七场 C Governing sand 权值线段树+贪心

    Governing sand 题意 森林里有m种树木,每种树木有一定高度,并且砍掉他要消耗一定的代价,问消耗最少多少代价可以使得森林中最高的树木大于所有树的一半 分析 复杂度分析:n 1e5种树木,并 ...

  2. 牛客训练赛25-A-最长区间

    https://www.nowcoder.com/acm/contest/158#question 这题问最长的严格连续递增序列的最长长度是多少? 最开始感觉这道题不可做,因为有1e5个点,还有1e5 ...

  3. 牛客训练赛25-A-因数个数

    题目链接https://www.nowcoder.com/acm/contest/158/A 无语...这题很迷啊,原谅我的菜,刚开始想用预处理欧拉筛和前缀和,可是这题太血崩了,这样一样要遍历,1-e ...

  4. 这是一个数学题牛客训练赛E

    题目描述   https://www.nowcoder.net/acm/contest/78/E 已知有一个n+1个数的数列,对于给定的A0和An ,当i满足当1<=i<=n-1时有    ...

  5. 牛客练习赛28-B(线段树,区间更新)

    牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ ​ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, ​ 1 l r 询问区间[l,r]内的元素和 ​ 2 l r 询问区间[l,r]内的 ...

  6. 牛客巅峰赛S2第6场题解

    牛客编程巅峰赛S2第6场 A-StringⅡ 题目 题目描述 给出一个仅包含小写字母的字符串s,你最多可以操作k次,使得任意一个小写字母变为与其相邻的小写字母(ASCII码差值的绝对值为1),请你求出 ...

  7. 牛客小白赛1 F题三视图

    链接:https://www.nowcoder.com/acm/contest/85/F来源:牛客网 题目描述 Etéreo 拿出家里的许多的立方体积木,堆成了一个三维空间中的模型.既然你高考选了技术 ...

  8. 牛客小白赛4J——强迫症

    链接:https://www.nowcoder.com/acm/contest/134/J 来源:牛客网 思路:把数列排序,把每一个重复的元素和最后一个数想加得到新数,在删掉这一元素即为去重的最少步骤 ...

  9. 牛客小白赛4 A 三角形 数学

    链接:https://www.nowcoder.com/acm/contest/134/A来源:牛客网 题目描述 铁子从森林里收集了n根木棍,她开始将它们按顺序的排成一排,从左到右依次为1到n,她回想 ...

随机推荐

  1. LeetCode93 Restore IP Addresses

    题目: Given a string containing only digits, restore it by returning all possible valid IP address com ...

  2. 关于取List中的指定几条数据以及注意事项

    list1 = list2.subList(start, end); start,end分别是第几个到第几个. 注意的是此方法和substring一样,包含前不包含结尾,取下标索引 另一个注意的地方是 ...

  3. DENSE_RANK(),允许并列名次、名次不间断,如122344456

    将score按ID分组排名:dense_rank() over(partition by id order by score desc) 将score不分组排名:dense_rank() over(o ...

  4. List of open source software

    List of open source software https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/ ...

  5. ListView 适配器实现getviewtypecount() 数组越界IndexOutOfBoundException

    ListView中Item的多布局显示,需要用到了getviewtypecount和getItemViewType这两个重写方法,但是做完后出现了如下提示错误: java.lang.ArrayInde ...

  6. TP-admin即基于ThinkPHP5拿来即用高性能后台管理系统

    TP-Admin即基于ThinkPHP5的web后台管理系统(总结一套自己的后台管理系统,方便自己后续的项目开发.) 主要特性:自适应手机端.支持国际化.吸取其他CMF框架优点.多站点部署.日志记录. ...

  7. C#面向对象--练习题

    public class Program { //用户自定义:我们自己定义这种数据类型 public struct jiegouti// 结构体前面加上public, 可供外界访问 { public ...

  8. H3C DCC概念

  9. linux用户权限管理, chmod, ln

    1 /etc/passwd文件 用户名  密码    UID        GID           Full Name                      主目录               ...

  10. H3C PAP验证配置示例