题目描述
“我是番茄酱!”
“我是黄芥末酱!”
“合在一起就是——美式热狗上加的,那个!“
热狗树上的每个节点都涂有番茄酱或者黄芥末酱中的一种,这样热狗树就变得美味了~LiMn2O4构造了一颗热狗树,他想知道这棵树的美味程度。
一个热狗树的美味程度,定义为每个节点到其他和自己口味不一样的节点的最短距离之和的和,也就是任意两个口味不同的节点之间的路径长度和。请你求出这颗树的美味值,并且答案对998244353取模。

输入
第一行一个正整数N。
第二行有N个数,他们的值在[0,1]范围内取,其中1代表是涂了番茄酱,0代表是涂了黄芥末酱。
接下来N-1行,每一行有三个数a,b,w。代表节点a到b有边,路径的权值是w。输入数据保证是一棵树。
N≤100000,1≤a,b≤N,w<1 000 000 000

输出
输出答案对998244353取模后的结果。

样例输入
复制样例数据
3
1 0 1
1 2 1
1 3 2
样例输出
8

提示
树(tree)是包含n(n>=0)个结点的有穷集,其中:
(1)每个元素称为结点(node);
(2)有一个特定的结点被称为根结点或树根(root)。
(3)除根结点之外的其余数据元素被分为m(m≥0)个互不相交的集合T1,T2,……Tm-1,其中每一个集合Ti(1<=i<=m)本身也是一棵树,被称作原树的子树(subtree)。
补一下以前的坑,当时比赛的时候没有做到这个题。。今天想起来了,就来补一下。
统计不同颜色的节点互相到达的距离和。要是我们去枚举点到点的距离,这样肯定是不行的,因为那样是O(n^2) 的时间复杂度。一般这样我么就去枚举边,因为边的条数不多。那么我们去考虑一下每条边的贡献。每一条边的贡献就等于这个节点的子树中0的个数*(1的个数-子树中1的个数)* w+子树中1的个数*(0的个数-子树中0的个数)。
代码如下:

#include<bits/stdc++.h>
#define ll long long
#define mod 998244353
using namespace std;const int maxx=1e5+100;
struct edge{int to;int next;ll w;
}e[maxx<<1];
int head[maxx],col[maxx];
ll dp[maxx][2],ans,cnt1,cnt0;
int n,tot;void add(int u,int v,ll w)
{e[tot].to=v;e[tot].w=w;e[tot].next=head[u];head[u]=tot++;
}inline void dfs(int u,int f)
{dp[u][col[u]]=1;for(int i=head[u];i!=-1;i=e[i].next){int to=e[i].to;if(to==f) continue;dfs(to,u);ans=(ans+(dp[to][1]*(cnt0-dp[to][0])%mod)*e[i].w%mod)%mod;ans=(ans+(dp[to][0]*(cnt1-dp[to][1])%mod)*e[i].w%mod)%mod;dp[u][1]+=dp[to][1];//记录1的个数dp[u][0]+=dp[to][0];//记录0的个数}
}
int main()
{int l,r;ll w;while(~scanf("%d",&n)){tot=cnt1=cnt0=0;memset(head,-1,sizeof(head));for(int i=1;i<=n;i++) scanf("%d",&col[i]),cnt1+=col[i];cnt0=n-cnt1;for(int i=1;i<n;i++){scanf("%d%d%lld",&l,&r,&w);add(l,r,w);add(r,l,w);}ans=0;dfs(1,0);printf("%lld\n",ans*2%mod);//每一条边的贡献我们在dfs的时候只求了一遍,但是实际上一条边该是贡献了两遍价值}return 0;
}

努力加油a啊,(o)/~

热狗树 树形dp(中国石油大学我要变强第九场)相关推荐

  1. [WC2018]通道——边分治+虚树+树形DP

    题目链接: [WC2018]通道 题目大意:给出三棵n个节点结构不同的树,边有边权,要求找出一个点对(a,b)使三棵树上这两点的路径权值和最大,一条路径权值为路径上所有边的边权和. 我们按照部分分逐个 ...

  2. [APIO2018]铁人两项——圆方树+树形DP

    题目链接: [APIO2018]铁人两项 对于点双连通分量有一个性质:在同一个点双里的三个点$a,b,c$,一定存在一条从$a$到$c$的路径经过$b$且经过的点只被经过一次. 那么我们建出原图的圆方 ...

  3. P2607-[ZJOI2008]骑士【基环树,树形dp】

    正题 题目大意 每个骑士有一个不可以同时上场的骑士,和一个战斗力.求最大战斗力. 解题思路 类似没有上司的舞会 其实就是在基环树森林,我们可以利用二次树形dp的方法. 先找到环,然后强行将环断开进行一 ...

  4. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问, 每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接. 最少的边权和是多少. (n<=250000,sigma(ki)&l ...

  5. BZOJ5419[Noi2018]情报中心——线段树合并+虚树+树形DP

    题目链接: [NOI2018]情报中心 题目大意:给出一棵n个节点的树,边有非负边权,并给出m条链,对于每条链有一个代价,要求选出两条有公共边的链使两条链的并的边权和-两条链的代价和最大. 花了一天的 ...

  6. bzoj 3611: [Heoi2014]大工程(虚树+树形DP)

    3611: [Heoi2014]大工程 Time Limit: 60 Sec  Memory Limit: 512 MB Submit: 1697  Solved: 718 [Submit][Stat ...

  7. 最大疯子树-树形dp+换根+二次扫描

    分析: 疯子树肯定还是一棵树. 所以,所谓的最短路径就是吓唬你的,树上两点之间有且只有一条路径. b1和b2必须是相邻的,否则不可能是一棵疯子树. 再想一想,用同样的方式构造剩下的点的话,那么可以得到 ...

  8. P2495 [SDOI2011]消耗战-虚树+树形dp

    https://www.luogu.com.cn/problem/P2495 虚树:当我们在解决树形dp的问题的时候,题目中会给出一些询问,询问涉及的关键节点不多,并保证总的点数规模的时候,我们就可以 ...

  9. BZOJ5341[Ctsc2018]暴力写挂——边分治+虚树+树形DP

    题目链接: CSTC2018暴力写挂 题目大意:给出n个点结构不同的两棵树,边有边权(有负权边及0边),要求找到一个点对(a,b)满足dep(a)+dep(b)-dep(lca)-dep'(lca)最 ...

最新文章

  1. 报名 | AI Time:“ 论道自动机器学习与可解释机器学习”
  2. An internal error occurred during: “AppXray Indexing
  3. js aop 拦载实现
  4. 近期吉他练习曲目《爱的罗曼史》,安排每天晚上睡觉前练习1小时!
  5. thinkphp与php共享session
  6. 二维数组作为函数参数
  7. oracle 查表的用户名和密码,查看Oracle数据库中的所有用户名
  8. kvm实战--convirt使用
  9. 用python设计图案_用 Python 打造属于自己的GUI图形化界面
  10. (9)Redis-Cluster集群理论及实践【下】
  11. Idea利用JSP模板设置统一路径(basePath)
  12. Java单链表头插法和尾插法以及增删改查方法
  13. ThingJS 和Threejs在3D开发框架性能上,谁更优秀?
  14. 20200608模拟赛 Endless
  15. adc芯片资料——电子迷你秤芯片CS1180
  16. Jenkins打包部署项目到Windows或Linux运行
  17. 地磅系统——车辆识别系统的自动化管理
  18. 微信小程序开发过程中出现的内存泄漏问题
  19. 实习html周日志,实习日志:最后的一周
  20. 【刷题-剑指 Offer】 54. 二叉搜索树的第k大节点

热门文章

  1. 大学计算机第三单元测试题及答案,MOOC计算机网络第三单元测验(哈尔滨工业大学)...
  2. solaris php,solaris 十系统上架构phpwind论坛环境(转)
  3. html链接是什么意思,html中url什么意思?怎么用?
  4. java的弱引用_深入理解Java中的弱引用
  5. python怎么加图片_怎么在图片旁边加文字 python如何在图片上添加文字 - 励志 - 52资讯网...
  6. windows平台下用CMake工具编译osg用法说明
  7. Android开发之ConstraintLayout(约束布局)一个控件位于一个控件右上角类似RelativeLayout实现效果
  8. eclipse运行android程序,总是启动一个新的AVD模拟器,解决办法
  9. 接口应用练习题(用接口的方式实现某网上商城的网上支付功能)
  10. Java并发编程-volatile关键字介绍