题解:Luogu P14254 分割(divide)

news/2025/10/20 22:03:44/文章来源:https://www.cnblogs.com/P2441M/p/19153772

题意

给定一棵 \(n\) 个点的树,设根节点 \(1\) 的深度为 \(1\)。给定 \(k\),求有多少从树中选出 \(k\) 个两两不同的节点,组成有序序列 \(b_1,\cdots,b_k\) 的方案,使得:

  • 对于每个 \(1\leq i<k\)\(1<d_{b_i}\leq d_{b_{i+1}}\)
  • 对于每个 \(b_i\),断掉其与父亲的连边,得到 \(k+1\) 个连通块,设 \(b_i\) 为根的连通块的 \(d\) 集合为 \(S_i\),以 \(1\) 为根的连通块的 \(d\) 集合为 \(S_{k+1}\),那么需要满足 \(S_1=\bigcap\limits_{i=2}^{k+1}S_i\)

答案对 \(998244353\) 取模。\(2\leq k\leq n\leq 10^6\)

题解

验题人题解,自认为比较自然的思路。

显然一个连通块的深度集合是一个区间 \([l_i,r_i]\),考虑这些区间的左端点,第一条限制相当于说 \(l_1\leq l_2\leq\cdots\leq l_{k}\),但第二条限制又说明 \(l_1=\max\limits_{i=2}^{k+1}l_i\),因此必然有 \(l_1=l_2=\cdots=l_k\)。也就是说选出来的 \(b_i\) 深度必须相同,这启发我们对不同深度的点分开来做。

对于每个点 \(u\),DFS 预处理出 \(a_u=\max\limits_{v\in sub_u}d_v\)。考虑右端点的限制,设 \(B=\{b_1,\cdots,b_k\}\),那么第二条限制等价于要求:

\[a_{b_1}=\min\left(\min_{i=2}^{k}a_{b_i},\max_{u\not\in B}a_u\right) \]

接下来设上式的 \(\min\) 里面前者为 \(X\),后者为 \(Y\)

把当前深度所有点按 \(a\) 值排序,枚举 \(a_{b_1}\),则对于每个 \(a_{b_i}(i>1)\) 都有 \(a_{b_i}\geq a_{b_1}\)。设 \(c_1\)\(a=a_{b_1}\) 的点数,\(c_2\)\(a>a_{b_1}\) 的点数。进一步分类讨论 \(\min\) 的取值:

  • \(a_{b_1}=X\leq Y\):可以拆成两条限制:一个是存在 \(b_i(i>1)\) 使得 \(a_{b_i}=a_{b_1}\),另一个是 \(a\geq a_{b_1}\) 的点没有全部选完。对于第二条限制,保证 \(c_1+c_2>k\) 即可,对于第一条限制,我们正难则反,用总方案数 \(A_{c_1+c_2-1}^{k-1}\) 减去不合法的方案数 \(A_{c_2}^{k-1}\)。因此若 \(c_1+c_2>k\),这种 case 合法,答案是 \(c_1(A_{c_1+c_2-1}^{k-1}-A_{c_2}^{k-1})\)
  • \(a_{b_1}=Y<X\):发现这是一个很强的限制,对于所有 \(i>1\),都有 \(a_{b_i}>a_{b_1}\),且 \(a>a_{b_1}\) 的点要全部选完。注意要让 \(Y\) 能取到 \(a_{b_1}\) 还需要有 \(c_1\geq 2\)。因此若 \(c_1\geq 2\land k-1=c_2\),这种 case 合法,答案为 \(c_1\cdot c_2!\)

时间复杂度 \(\mathcal{O}(n\log{n})\),瓶颈在于排序。

代码

#include <bits/stdc++.h>using namespace std;#define lowbit(x) ((x) & -(x))
typedef long long ll;
typedef pair<int, int> pii;
const int N = 1e6 + 5, MOD = 998244353;template<typename T> inline void chk_min(T &x, T y) { x = min(x, y); }
template<typename T> inline void chk_max(T &x, T y) { x = max(x, y); }
inline int add(int x, int y) { return x += y, x >= MOD ? x - MOD : x; }
inline int sub(int x, int y) { return x -= y, x < 0 ? x + MOD : x; }
inline void cadd(int &x, int y) { x += y, x < MOD || (x -= MOD); }
inline void csub(int &x, int y) { x -= y, x < 0 && (x += MOD); }int n, k, ans, fa[N], dep[N], mxd[N];
int fac[N], ifac[N];
vector<int> vec[N];struct AdjList {int tot, head[N], nxt[N], to[N];inline void ins(int x, int y) { to[++tot] = y, nxt[tot] = head[x], head[x] = tot; }
} T;inline int qpow(int a, int b) {int res = 1;for (; b; b >>= 1) {if (b & 1) res = (ll)res * a % MOD;a = (ll)a * a % MOD;}return res;
}
inline void pre() {fac[0] = 1;for (int i = 1; i <= n; ++i) fac[i] = (ll)fac[i - 1] * i % MOD;ifac[n] = qpow(fac[n], MOD - 2);for (int i = n - 1; ~i; --i) ifac[i] = (ll)ifac[i + 1] * (i + 1) % MOD;
}
inline int A(int n, int m) { return (n < 0 || m < 0 || n < m) ? 0 : (ll)fac[n] * ifac[n - m] % MOD; }
inline void dfs(int x) {for (int i = T.head[x]; i; i = T.nxt[i]) {int y = T.to[i];mxd[y] = dep[y] = dep[x] + 1, dfs(y);chk_max(mxd[x], mxd[y]);}vec[dep[x]].push_back(mxd[x]);
}int main() {ios::sync_with_stdio(0), cin.tie(0);cin >> n >> k, pre();for (int i = 2; i <= n; ++i) cin >> fa[i], T.ins(fa[i], i);dep[1] = 1, dfs(1);for (int d = 2; d <= mxd[1]; ++d) {sort(vec[d].begin(), vec[d].end());int cnt = 0, sum = 0;for (int i = 0; i < vec[d].size(); ++i) {if (!i || vec[d][i] == vec[d][i - 1]) ++cnt;else {int cntr = vec[d].size() - sum - cnt;if (k < cntr + cnt) cadd(ans, (ll)cnt * sub(A(cntr + cnt - 1, k - 1), A(cntr, k - 1)) % MOD);if (cnt >= 2 && k - 1 == cntr) cadd(ans, (ll)cnt * fac[cntr] % MOD);sum += cnt, cnt = 1;}}if (k < cnt) cadd(ans, A(cnt, k));}cout << ans;return 0;
}

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

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

相关文章

31_创蓝短信接入资料和定价

创蓝短信接入资料和定价 公司简介 创蓝云智为企业提供短信、语音外呼、闪验、号码检测、实名认证等通讯类产品,致力于让企业更高效高质量的获得用户及触达用户。 产品类型通知短信 会员营销短信 国际营销短信 验证码短…

构造单

题目来源 取模下序列构造 是否存在 \(3\) 个长度为 \(n\) 的 \([0,n)\) 的排列 \(a,b,c\),使得 \(a_i+b_i=c_i\mod n\) 遇到取模考虑奇偶性,不要像太复杂,考虑 \(n\) 为奇数的时候直接 \(a=b=~0,1,2,3,4,…\),\(c=…

02.Python百行代码实现抽奖系统

02.Python百行代码实现抽奖系统 ------------------------------------------------ 执行后——————————————————————————————————————————————————————————…

[笔记]高斯消元

高斯消元法是求解线性方程组的经典算法。 内容 求解如下的线性方程组(P3389 【模板】高斯消元法): \[\begin{cases} a_{1,1}x_1+a_{1,2}x_2+\dots+a_{1,n}x_n=b_1\\ a_{2,1}x_1+a_{2,2}x_2+\dots+a_{2,n}x_n=b_2\\ …

[SSH] scp:基于 SSH 的安全文件传输

[SSH] scp:基于 SSH 的安全文件传输$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");目录01 简介02 操作2.1 本地发送到远程2.2 从远程下载2.3 主机之间复制…

CSP-S 35

10.2010.20 神秘%你赛,rk1 170 ,你管这叫CSP-S? t1 赛时狂写t1 ,想了半天想出来个神秘做法,时间复杂度不会证但应该是对的,写完本地大阳历1.2s 感觉应该没啥大问题,结果空间炸了,最后2h写的代码和暴力分一样多 …

题解:P11662 [JOI 2025 Final] 方格染色 / Grid Coloring

题目传送门 是一道黄题 这里提供一种 \(O(n\log n)\) 的做法\(\mathscr{PART\ \ ONE}\)我们在手%的时候不难发现(注意力有点也不惊人) 虽然第一列和第一行 不保证有序 但是因为这里的前缀$\ max\ $性质保证了第二列和…

CSP-S 32 多校5

10.1510.15 S-32&&多校5 签到后遗憾离场。 t1 签到题,大力分讨即可。 注意符号。 记得排序(没大阳历时忘排序了) code锵锵 #include <bits/stdc++.h> using namespace std; const int N = 1e6 + 10;…

CSP-S 33

10.1710.17 t1 签到题 注意到约数只有 \(O(\sqrt n)\) 级别,暴力找约数即可。 唐人当然有唐做法啦! 分解质因数+dfs搜约数 反正唐就对了。 code嘻嘻 #include <bits/stdc++.h> #define int long long #define…

CSP-S 29

10.11 只记录了当时认为有意义的题10.11 t3 赛后才看懂题面 \(\ldots\) 妈妈我会推式子!(骗你的其实我不会) 推完式子就过了。 考虑先求出 \(1\) 为根时的答案,之后换根即可。 开始拆贡献ing 对于根结点,由于一开…

10.20每日总结

今天主要的课程有软件设计,软件开发案例分析,大数据技术,物联网工程。完成了好几项作业,满课还是太忙太累了,软考网课开始第三章。

CSP-S 31

10.1410.14 看大家得分跟信心赛似的,就我一个唐诗写了一场暴力 \(\ldots\) 开场t1没切出来就开始慌了,之后就想着多打暴力拿部分分,导致t2得出的性质没有推广,t3,t4暴力都没写出来(这俩得出性质/部分性质后比暴力…

2025网络安全振兴杯wp

振兴杯wp web1 神探狄仁杰在js和源代码,以及关于里面有flag的base64字段 css中关于的源代码中然后解密就行了 web2Darksale 这个是一个原型链污染 我们发现购买的金额可以被改变我们发现改价格后会回显出来我们尝试修…

ES原理、zookeeper、kafka

ES原理、zookeeper、kafkaES高级 ES底层原理 协调节点是 Elasticsearch 中接收客户端请求、将请求转发到相关数据节点、并汇总最终结果返回给客户端的中心路由节点 Cluster State 是 Elasticsearch 集群的元数据大脑,…

CF1606E Arena 题解(动态规划)

考虑设 \(f_{i,j}\) 表示现在存活 \(i\) 个人,血量最大的人为 \(j\)。这么设是因为注意到有没有胜者其实之和血量最大的是谁,以及有多少个血量最大的有关。 边界情况 \(f_{1,i}=0\)。 考虑转移。如果 \(j<i\),则…

服务器CPU市场概况2025

2025年的服务器CPU市场正处于关键转型期。传统的x86架构(以Intel和AMD为代表)依然占据主导,但基于Arm的解决方案正在快速崛起。随着人工智能(AI)、云计算和高性能计算(HPC)的普及,CPU的设计趋势正在朝着能效优…

CSP-S 24

9.21~9.2?9.21 今天开始集训告一段落了,去补文化课一周。 如果写不完回来会补(?) 115=100+0+15 t1 先等会 t2 先等会 t3 9.22:回来补债了 \([\gcd(i,j)=1]=[\gcd(p_i,p_j)=1]\) 这个限制初看好像很难转化,只能猜…

正睿 2025 NOIP20 连测 Day5 做题记录

T1给 \(m\) 个质数,第 \(i\) 个质数 \(p_i\) 出现了 \(n_i\) 次。求一种划分质数的方案,使得第一个集合的和等于第二个集合的乘积。萌萌题,注意到最后相当于是要求 \(p_1^{\alpha_1}p_2^{\alpha_2}\cdots p_k^{\alp…

29-腾讯云COS接入指南与价格说明

腾讯云对象存储(COS)接入流程与价格说明 一、腾讯云COS简介 腾讯云对象存储(Cloud Object Storage,COS)是腾讯云提供的一种存储海量文件的分布式存储服务,具有高扩展性、低成本、高可靠性和高安全性等特点。用户可…