ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NOI 2020 D1T2 命运(Destiny) Solution

2021-10-17 01:31:30  阅读:163  来源: 互联网

标签:NOI parent text 线段 Solution limit mathcal dp Destiny


NOI 2020 D1T2 Destiny

Task

给定 \(n\) 个点的以 \(1\) 为根的有根树,有 \(m\) 条约束,每条约束包含一个点对 \((u,v)\),满足 \(u\) 是 \(v\) 的祖先,你需要给每条边染成黑白两种颜色,满足对于每条约束,\(u\rightarrow v\) 的路径上都有一条黑边,求合法方案数。

答案对 \(998244353\) 取模。

限制:\(1\le n,m\le 5\times10^5\)

Solution

预处理 \(\text{limit}[u]\) 表示 \(u\) 往上的黑边中,最近的黑边的深度需要大于等于 \(\text{limit}[u]\)。这里的 \(\text{limit}\) 仅考虑以点 \(u\) 为下端点的限制

用 \(\text{parent[u]}\) 来表示 \(u\) 的父亲结点,设 \(\text{dp}[u][d]\) 表示 \(\text{parent}[u]\) 往上最近的黑边的深度为 \(d\) 的方案数。

设 \(\mathcal V\) 表示点 \(u\) 的儿子集合。

接下来考虑求出 \(\text{dp}[u][d]\),根据边 \((\text{parent}[u],u)\) 染色的情况分类讨论:

\[\text{dp}[u][d]=[d\ge\text{limit[u]}]\prod_{v\in\mathcal V}\text{dp}[v][d]+\prod_{v\in \mathcal V} \text{dp}[v][\text{dep}[u]] \]

前者是染白的方案数,后者是染黑的方案数。

然后我们考虑对树上的每一个结点开一棵线段树维护 \(\text{dp}\) 数组,具体来说,结点 \(u\) 所对应的线段树的 \([d,d]\) 区间维护了 \(\text{dp}[u][d]\) 的值。

然后我们考虑 \(\text{dp}\) 的转移是如何体现在线段树上的操作的:

  1. 我们将线段树的 \(\text{limit}[u]\sim n\) 的位置区间加为 \(1\),表示这些位置是可以被染成白边的。
  2. 我们将 \(u\) 的所有儿子对应的线段树合并起来,也就是对应位置的值相乘,这一步是为了计算染成白边的方案数。
  3. 接下来我们查询这棵树上 \(\text{dep}[u]\) 对应的值,全局加上这个值。

总结一下,我们的线段树需要支持

  1. 区间加
  2. 单点查询
  3. 区间对应位置乘

这里需要使用到线段树合并 pushdown 的 trick,只要该点没有左右儿子,就不需要 pushdown

什么时候,我们才能真正决定自己的命运呢?

标签:NOI,parent,text,线段,Solution,limit,mathcal,dp,Destiny
来源: https://www.cnblogs.com/hl-fc/p/15415834.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有