Codechef Painting Tree 题解 [ 蓝 ] [ 树形 DP ] [ 概率期望 ] [ 分类讨论 ]

news/2025/10/27 21:28:36/文章来源:https://www.cnblogs.com/zhr0102/p/19169793

Painting Tree

若干个月前模拟赛切的题,当时写了 3h+,被细节恶心坏了,遂记之。

题意可以转化为求树上存在相交链的期望时间。

考虑如何计算这个期望。显然我们可以枚举选取链的个数,根据期望的定义式来算:

\[E(X) = \sum_{i = 1}^{n}P(Len = i)\times i \]

因为相交链出现在最后一个不交链时刻的下一时刻,所以问题就被我们转化为:对于每个 \(i\),求出最终不交链的数量 \(= i\) 的概率。

接下来就可以树形 DP 求解树上选择 \(\bm k\) 条链,使其不相交的方案数了。

观察链的性质,我们定义 \(dp_{u, v, 0/1/2}\) 分别表示节点 \(u\),体积为 \(v\)\(u\)不挂链 / 挂了链不可以延伸 / 挂了链可以延伸这三种状态。并且钦定一条链的体积被计算于它被截断的时刻

对于转移,我们需要处理以下几种情况:

  • 自己和儿子都不挂可延伸的链。
  • 自己和某个儿子可延伸的链合成一个新链。
  • 从某个儿子处接上可延伸的链。

一共八种转移方程,全部都需要转移,细节很多。

树形背包的方式进行合并,即可做到时间复杂度 \(O(n^2)\)

最后统计答案的时候,注意选择链的方案总数为 \((\dfrac{n(n+1)}{2})^i\times i!\)

#include <bits/stdc++.h>
#define fi first
#define se second
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
#define lc(x) (tr[x].ls)
#define rc(x) (tr[x].rs)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi = pair<int, int>;
const ll mod = 998244353;
const int N = 2005;
int n;
int dp[N][N][3], sz[N], f[N][3], ans; // 0 : 不挂链 ; 1 : 挂链不可延伸 ; 2 : 挂链可延伸
vector<int> g[N];
ll qpow(ll a, ll b)
{ll res = 1;while(b){if(b & 1) res = (res * a) % mod;b >>= 1;a = (a * a) % mod;}return res;
}
void merge(int u, int v)
{memcpy(f, dp[u], sizeof(f));memset(dp[u], 0, sizeof(dp[u]));for(int i = 0; i <= sz[u]; i++){for(int j = 0; j <= sz[v]; j++){// 自己和儿子都不挂可延伸的链dp[u][i + j][0] = (dp[u][i + j][0] + 1ll * f[i][0] * dp[v][j][0] % mod) % mod;dp[u][i + j][0] = (dp[u][i + j][0] + 1ll * f[i][0] * dp[v][j][1] % mod) % mod;// 自己和某个儿子可延伸的链合成一个新链dp[u][i + j + 1][1] = (dp[u][i + j + 1][1] + 1ll * f[i][2] * dp[v][j][2] % mod) % mod;dp[u][i + j][1] = (dp[u][i + j][1] + 1ll * f[i][1] * dp[v][j][0] % mod) % mod;dp[u][i + j][1] = (dp[u][i + j][1] + 1ll * f[i][1] * dp[v][j][1] % mod) % mod;// 从某个儿子处接上可延伸的链dp[u][i + j][2] = (dp[u][i + j][2] + 1ll * f[i][2] * dp[v][j][0] % mod) % mod;dp[u][i + j][2] = (dp[u][i + j][2] + 1ll * f[i][2] * dp[v][j][1] % mod) % mod;dp[u][i + j][2] = (dp[u][i + j][2] + 1ll * f[i][0] * dp[v][j][2] % mod) % mod;}}sz[u] += sz[v];
}
void dfs(int u, int fa)
{// 分别对应 不挂链、挂了链但是立刻被截断、挂了可延伸的链 的情况。dp[u][0][0] = dp[u][1][1] = dp[u][0][2] = sz[u] = 1;for(auto v : g[u]){if(v == fa) continue;dfs(v, u);merge(u, v);}
}
int main()
{// freopen("tree.in", "r", stdin);// freopen("tree.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for(int i = 1; i < n; i++){int u, v;cin >> u >> v;g[u].push_back(v);g[v].push_back(u);}dfs(1, 0);ll npath = (1ll * (n + 1) * n / 2) % mod, jc = 1;for(int i = 1; i <= n + 1; i++){if(i - 1) jc = (jc * (i - 1)) % mod;ans = (ans + 1ll * (dp[1][i - 1][0] + dp[1][i - 1][1]) % mod * qpow(qpow(npath, i - 1), mod - 2) % mod * jc % mod) % mod;}cout << ((ans - 1) % mod + mod) % mod;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/948100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux运行命令三种方式对比

三种方式临时测试 → nohup 稳定运行 → supervisor 系统级守护 → systemd测试用例/data/test.sh #!/bin/bash # /data/test.sh - Linux 简单输出时间的 demo 脚本while true doecho "$(date +%Y-%m-%d %H:%M:%S…

P14322 「ALFR Round 11」E 空崎ヒナ 题解 (markdown)

P14322 「ALFR Round 11」E 空崎ヒナ 题解 (markdown)## P14322 「ALFR Round 11」E 空崎ヒナ 题解**Sorasaki Hina 赛高!**也是做上 BA 的题了!也是写上 BA 的题的题解了!我们 BA 厨的日子真是蒸蒸日上啊!求审核大…

详细介绍:论文阅读 (1) :Control Flow Management in Modern GPUs

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

公众号排版2025年权威推荐:揭秘有一云AI编辑器为何高效?

01|痛点雷区清单:为什么总被“排版”拖慢?层级乱:复制到后台后行距、间距、引用样式全乱,返工 ≥ 2 轮。 版式碎:字体、分隔、留白没节奏,读者滑两屏就流失。 配图难:素材东拼西凑、风格不统一,还担心侵权。 …

P14322 「ALFR Round 11」E 空崎ヒナ 题解

Sorasaki Hina 赛高!P14322 「ALFR Round 11」E 空崎ヒナ 题解 Sorasaki Hina 赛高! 也是做上 BA 的题了!也是写上 BA 的题的题解了!我们 BA 厨的日子真是蒸蒸日上啊! 求审核大大通过 QvQ。求求了! 题目描述:给…

[题解]P7074 [CSP-J 2020] 方格取数

P7074 [CSP-J 2020] 方格取数 如果设 \(f_{i,j}\) 为 \((1,1)\) 到 \((i,j)\) 的最大权值和,上下相邻的两个元素的转移就是双向的了。有后效性,无法 DP。不过题目说“不能重复经过已经走过的方格”,也就是说每一列只…

昨天线下赛的复盘

这次最大的感受:Re做题的时候不要啥都没分析出来就去写代码,不要觉得自己写着写着就能看懂,不可能的,不如先分析好,即使是先猜一下呢,还有就是测试数据不要写0,会和本身就是空的数据混了 Re1 分最少的一题,附件…

10 27

P11833因为我们有 \(a_i < a_{i+1}\) 且 \(b_i < b_{i+1}\) 这里我是想怎么样才能统计两两之间的影响,发现十分复杂并且是 \(O(N^2)\) 的也无法优化 然后我就发现时间限制的深意是否可以说是按照时间顺序从小到…

同余最短路学习报告

笑点解析:高一了终于知道同余最短路是什么了。谁家好人同余最短路真的写最短路啊同余最短路,一种题目类型,隶属于图论板块,一般是问你有 n 个值,重复选取能拼出多少值,或者拼出模 k 余 p 要多少个值等等等等。 对…

打包exe出错了:

打包exe出错了: Traceback (most recent call last): File "huu.py", line 6, in n = int(input(enter:)) RuntimeError: input(): lost sys.stdin 源码: python print(判断一个数是否为素数) print()whi…

19 lambda表达式的简化过程

19 lambda表达式的简化过程Lambda表达式 为什么引入lambda表达式?避免内部类定义过多 去掉无意义代码,只留下核心逻辑函数式接口 定义:任何借口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。 对于函数…

详细介绍:Redis多租户资源隔离方案:基于ACL的权限控制与管理

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

二分查找边界

二分查找边界二分查找边界Q:给定一个长度为𝑛的有序数组nums ,其中可能包含重复元素。请返回数组中最左一个元素target的索引。若数组中不包含该元素,则返回−1 。查找左边界 回忆二分查找插入点的方法,搜索完成…

求解 LCA 的三种方法及其比较

本文写于 2025 年 10 月 24 日。 昨天看到岁岁似今朝以“学不成名誓不还”的勇气学 LCA(树上最近公共祖先),并感叹“LCA 是我最严厉的母亲”,心血来潮,也学了一下。翻看着洛谷玲琅满目的题解,竟学会了三种方法,…

策略模式优化if-else

class Calculator:def __init__(self):self.strategy = Nonedef set_strategy(self, strategy):self.strategy = strategydef calculate_result(self, num1, num2):return self.strategy.execute(num1, num2)class Add…

捐赠

题目 题目描述 有 \(A\)、\(B\) 两类物品。 paper 打算每类各选 \(k\) 个(\(k\) 可自由决定,可取 \(0\))一起捐出。捐赠的总贡献为所选物品的价值总和。 初始时 paper 没有物品,但是 paper 可以通过一些操作改变物…

学习笔记:重链剖分

本文写于 2025 年 9 月 28 日。 前言 这几天一下课,班里的某位同学就走到我座位旁边,念叨着“来学树剖”。在他的 传销 诈骗 怂恿 鼓励之下,我也终于来到了这座大山面前,但发现似乎也并不难…… 何为重链剖分 考虑…

P3232 [HNOI2013] 游走

考虑贪心。 随机游走则显然每条边期望经过次数越大则其编号应越小。 每条边的期望经过次数难以计数,考虑每个店期望经过次数,设计状态 \(f_i\) 表示点 \(i\) 期望经过次数。 转移: \(f_i=\sum_{v\in e_i}f_v\cdot \…

FRP 后端无法获取请求者IP解决方案

FRP 后端无法获取请求者IP解决方案📝 FRP 后端无法获取请求者真实 IP?别慌,解决方案来啦!🧐 问题背景 当你使用 FRP 进行内网穿透或代理服务时,是否遇到过这样的困扰: 后端服务拿到的客户端 IP 全都是 FRP 服…

正睿 2025 NOIP 20连测 Day9

坐在前面的老哥 AK 了。他怎么这么成功,我怎么这么失败/ll。 T1小 W 有 \(n\) 个球,每个球都有一种颜色,其中第 \(i\) 个球初始的颜色可以用正整数 \(a_i\) 来表示,一共有 \(m\) 种颜色。 在一次染色操作中,小 W …