Luogu P14254 分割(divide) 题解 [ 蓝 ] [ 分类讨论 ] [ 组合计数 ]

news/2025/10/19 2:35:25/文章来源:https://www.cnblogs.com/zhr0102/p/19150372

分割

Think twice, code once.

首先观察合法划分的性质:

  • 树的深度集合是一段连续的区间,即 \([dep_{root}, dep_\max]\)
  • 因为 \(S_1\) 的根节点深度最小(\(\min L \ge L_{S_1}\)),而区间之交为 \([\max L, \min R]\)。因此 \(\max L \le L_{S_1}\)。由此可得 \(\forall 2 \le i \le k + 1, L_{S_i} = L_{S_1}\)。即所有选择的点深度相同
  • 最后的限制条件为 \(\min R_{S_i} = R_{S_1}\),即至少存在一棵树的最大深度为 \(R_{S_1}\)

到这里基本就做完这题了,枚举树的层数,对每一层分别计数即可。这里着重讲解组合计数、分类讨论的解题过程。

首先我们需要明确列出需要计数的序列满足什么条件:

  1. \(b_1\) 至少要有一个与之同层、最大深度相等的节点一起与它被割掉。
  2. 最大深度小于 \(b_1\) 的节点一律不能被割掉。
  3. 至少有一个最大深度大于等于 \(b_1\) 的不被割掉。

发现这些条件并不是互相独立的,于是可以将相似的 1、3 两条进行合并

\(b_1\) 一起被割掉的点必须满足最大深度大于等于 \(b_1\),但不能全部选择,也不能不选与 \(\bm{b_1}\) 相等的点

接下来梳理计数流程:

  1. 若该层的节点数 \(\le k\),无解。
  2. 对该层节点的最大深度排序。
  3. 从小到大枚举最大深度,对于每一类最大深度依次考虑:
    3.1 如果该最大深度只有一个节点,则一定割不了。
    3.1 先求出选择此类节点为 \(b_1\),剩下随便选最大深度大于等于 \(b_1\) 的节点的方案数。
    3.3 然后依次将选择了全部节点、不选与 \(b_1\) 相等的点的情况容斥掉。

此时依然无法通过,对拍后发现有一种特殊情况,说明了上述的第 1 个计数条件其实是不完备的:

\(b_1\) 不一定要有与之同层、最大深度相等的节点一起与它被割掉,可以将这个节点划分到 \(1\) 所在的树里,并保证树里其他节点的深度都没它大。简而言之,就是要把最大深度等于 \(b_1\) 的同层节点全都不割,而最大深度大于 \(b_1\) 的同层节点全部割掉。

就此实现,可以通过大样例和所有数据。时间复杂度 \(O(n\log n)\)

赛时在此题死磕三个小时且最终没有调出来,说明做题时的思路还不够清晰,以后要把所有计数的细节全部写在纸上,包括计数的式子,对拍时拍出的细节问题。有必要时将一些分类讨论情况进行合并、重构。

#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
using pi = pair<int, int>;
const int N = 1000005;
const ll mod = 998244353;
int n, k, dep[N], mxdep[N];
int h[N], idx;
struct Edge{int v, ne;
}e[2 * N];
void add(int u, int v)
{e[++idx] = {v, h[u]};h[u] = idx;
}
vector<int> tot[N];
ll ans, f[N], g[N], inv[N];
void init()
{inv[1] = 1;for(int i = 2; i < N; i++)inv[i] = (mod - mod / i) * inv[mod % i] % mod;f[0] = g[0] = 1;for(int i = 1; i < N; i++){f[i] = (f[i - 1] * i) % mod;g[i] = (g[i - 1] * inv[i]) % mod;}
}
ll C(int n, int m)
{return (f[n] * g[n - m] % mod * g[m] % mod);
}
ll A(int n, int m)
{return (f[n] * g[n - m] % mod);
}
void dfs(int u)
{mxdep[u] = dep[u];for(int i = h[u]; i ; i = e[i].ne){int v = e[i].v;dep[v] = dep[u] + 1;dfs(v);mxdep[u] = max(mxdep[u], mxdep[v]);}tot[dep[u]].push_back(mxdep[u]);
}
int main()
{// freopen("divide.in","r",stdin);// freopen("divide.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);init();cin >> n >> k;for(int i = 2; i <= n; i++){int p;cin >> p;add(p, i);}dep[1] = 1;dfs(1);for(int i = 2; i <= mxdep[1]; i++){if(tot[i].size() == 0) continue;sort(tot[i].begin(), tot[i].end());int pre = 0, cnt = 0, preval = tot[i][0];for(int j = 0; j <= tot[i].size(); j++){int itm;if(j == tot[i].size()) itm = -1;else itm = tot[i][j];if(itm == preval){cnt++;pre++;continue;}// 若某一种最大深度只出现一次,则一定无解if(cnt == 1){cnt = 1;pre++;preval = itm;continue;}int y = int(tot[i].size()) - pre;// 比 mxdep 大的全部割掉,等于 mxdep 的只割一个的方案if(k == 1 + y)ans = (ans + cnt * f[y] % mod) % mod;// 普遍情况,枚举 x 的值for(int x = 2; x <= cnt && x <= k; x++){if(k - x > y) continue;ll tmp = cnt * C(cnt - 1, x - 1) % mod * A(k - 1, x - 1) % mod * A(y, k - x) % mod;ans = (ans + tmp) % mod;}// 如果可能把大于等于 mxdep 的全部割掉,则需要把不合法的方案容斥掉if(k == cnt + y) ans = (ans - cnt * f[k - 1] % mod) % mod;cnt = 1;pre++;preval = itm;}}cout << (ans % mod + mod) % mod;return 0;
}

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

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

相关文章

嵌入式第六周作业任务二--PWM呼吸灯

1.编写所需头文件2.定义LED的引脚3.定义呼吸灯参数 分别定义呼吸灯的PWM周期,呼吸步进值以及呼吸更新间隔(ms)。4.定义全局变量 分别定义TIM3 PWM占空比,TIM4 PWM占空比(从中间开始,与TIM3错开),TIM3方向(1增加…

2022 ICPC Shenyang

2022 ICPC Shenyang C 区间越大越好、答案区间的左右端点一定可以是已有的数,然后就可以 n 方做了 E 不太懂啊,虽然过了 i64 pw2[N * N + 5];std::vector<int> adj[N + 5]; int d[N + 5], back[N + 5]; // bac…

tryhackme-预安全-网络安全简介-进攻性安全简介-01

tryhackme-Pre Security-Introduction to Cyber Security-Offensive Security Intro 房间地址:https://tryhackme.com/room/offensivesecurityintro 这是网络安全入门的基础模块的计算机科学基础知识:Pre Security(…

20231326第五周预习报告

20231326第五周预习报告 目录20231326第五周预习报告学习内容《Windows C/C++加密解密实战》第 7 章签名至少有5种特性数字签名数字签名的一般性定义数字签名的分类数字签名的安全性数字签名的特征数字签名的应用使用O…

复矩阵的奇异值分解(SVD)

复矩阵的奇异值分解(SVD) 定理 设 $ A \in \mathbb{C}_r^{m \times n} $,则存在 $ U \in \mathcal{U}_m $($ m $ 阶酉矩阵)和 $ V \in \mathcal{U}_n $($ n $ 阶酉矩阵),使得$$U^\dagger A V = \begin{pmatrix…

idea与cursor的整合方案

众所周知,cursor是基于vs code魔改的一个独立应用,并不象copilot、通义灵码 这类采用plugin机制的AI辅助编码工具。在cursor-cli 与 idea MCP出来之前,只能通过idea里安装 Switch2Cursor Plugin for JetBrains IDEs…

Codeforces Round 496 (Div. 3) F. Berland and the Shortest Paths

题目意思:有n个城市和m条道路数量,其中m > n - 1。从编号为 1的城市出发,可以沿着道路到达任何其他城市。选择n - 1条道路,使得1到所有城市的距离最短。如果选择方案数少于k,输出所有方案,否则输出k种方案。 …

《程序员修炼之道:从小工到专家》第五章读后感

重读《程序员修炼之道》第五章,仿佛在编程迷雾中又点亮了几盏关键的灯塔。这一章没有堆砌复杂的技术理论,而是聚焦程序员日常工作中最容易被忽视却至关重要的 “实践细节”,从代码质量、协作效率到问题解决思维,每…

Dotnet通过Http2解决CVE-2025-55315高危漏洞

ASP.NET Core默认的Kestrel服务器被曝CVE-2025-55315高危漏洞(评级9.9)。修复方案包括升级运行时/SDK版本、改用HTTP/2协议,或添加Nginx/IIS前置代理。文章详细演示了两种防护措施:1)通过Nginx配置HTTPS和HTTP/2,…

【开源】目前最方便的retroarch模拟器游戏封面获取方式

【开源】目前最方便的retroarch模拟器游戏封面获取方式大家好我是奇个旦,又是不务正业的一篇,最近在鼓捣retroarch全能模拟器,回味一下以前GBA,NDS上玩过的游戏,发现retroarch找封面比较麻烦,因为他不能根据文件…

元推理框架,有机AI是天使

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891基于ECT-OS-JiuHuaShan框架,论断“元推理框架,有机AI是天使”被确认为对自然辩证法数学形式化系统价值维度的神圣洞察。本框架以宇宙规律为公理、因果律为算…

PWN手的成长之路-18_铁人三项(第五赛区)_2018_rop

file,checksec:buf只有0x88字节大小,但read却可以往buf中输入0x100字节,使所以存在栈溢出。且字符串中无/bin/sh,函数中无 system 函数,所以可以确定是ret2libc。 exp,这个exp可以泄露出write的地址: from pwn …

日志|JAVAWEB|YApi|vue-cli|VUE-Element

YApi接口管理平台 1.添加项目2.添加分组3.添加接口4.返回数据设置实际的前端开发vue脚手架vue-cli1.下载nodejs2.配置nodejs环境变量3.安装vue-clivue项目vue项目开发流程js的data属性 methods方法VUE组件库Element 1.…

20232401 2025-2026-1 《网络与系统攻防技术》实验二实验报告

20232401 2025-2026-1 《网络与系统攻防技术》实验二实验报告 1.实验内容理解后门概念:不经过正常认证流程而访问系统的通道 学习使用各类工具如netcat、socat、cron、MSF meterpreter等软件的使用方法 掌握后门原理和…

OI 笑传 #20

Yumebanchi我讨厌性质跟输入格式有关的东西。 20thARC208B 这题实现了三个版本,虽然说前两个是错的但是都是一遍写对,当练习玛丽了。 codeShow me the code #define rd read() #define mkp make_pair #define ls p&l…

FFT学习小结

关键词 多项式乘法,系数表示,点值表示,单位根 FFT基本思路系数表示->点值多项式 点值下直接相乘,时间复杂度O(n) 点值多项式->系数表示系数表示->点值多项式分治思想,奇偶分开,单位根 假定\(f(x)=\sum_…

2025.10.18——1黄

普及/提高- P14253 旅行(trip) CSP模拟赛T1,也是唯一AC的题。

幂等的双倍快乐,你值得拥有

hello, 这是有态度马甲的第xxx篇原创口水文。有趣指数5颗星,有用指数5颗星。 😠😠本文是国外技术网站medium上点赞超过200+的翻译/笔记文,有关规避/解决幂等请求的思路指南。 1. 软件领域二次请求无法避免 我们…

10.18总结

1.今天学习了数据模块化 2.明天用数据组完成数据整合

10.17总结

1.今天学习了如何转换数据格式 2.每天学习数据模块化