【题解】P14254 分割(divide)

news/2025/10/23 23:16:55/文章来源:https://www.cnblogs.com/Kcjhdsq/p/19161777

想了想,感觉这道题还是总结一下为好。

这个题需要涉及大量证明,也是很恶心人了。

引理一:当第 \(1\) 个点选择了深度为 \(i\),那后续所有节点的深度就只能为 \(i\)

证明:因为选择的点的深度是不降得,所以不能选深度小于 \(i\) 的点,如果后续有节点选择了深度大于 \(i\),则会造成 \(S\) 的并集会没有 \(i\)(因为你这个选择了深度小于 \(i\) 的节点造成的集合里必定没有 \(i\)),然而 \(s_1\) 是一定包括 \(i\) 的,所以就不相等了,则不能选择深度大于 \(i\) 的节点。

现在我们已经知道这个点,他要选就要在同一层里选了,那么我们直接一层一层的枚举就行了。

有个错误的贪心:就是在这一层中,你必须选择一个这些节点中所属子树中可遍历最大深度最小的节点。

这个贪心为什么看起来比较对呢,因为如果你选择上面所阐述的这种节点他的 \(S\) 集合范围是最小的。

但这个贪心错在哪呢?有的节点它可以并到 \(S_{k+1}\) 上,以至于他的最小深度不会被记录。

那我们枚举一个深度中的所有节点,让枚举到的这个节点作为 \(1\) 号节点,那以这个节点为一号节点的合法序列有那些呢?

我们设一个节点的所属子树最大向下拓展深度为 \(mx_i\)

引理二:对于 \(2\dots k+1\) 号选择的点,他们的 \(mx\) 值必须大于等于 \(mx_1\)

证明:如果存在节点的 \(mx\) 值小于 \(mx_1\),那么就会出现 \(S_1\)\(mx_1\),然而 \(S\) 的并集却不存在 \(mx_1\),因为那个 \(mx\) 值小于 \(mx_1\) 的节点所形成的集合中就没有 \(mx_1\)

引理三:对于 \(2\dots k+1\) 号选择的点,必定有一个节点的 \(mx\) 值等于 \(mx_1\)

证明:就是防止 \(S\) 的并集从 \(mx_1\) 继续向下拓展。

我们把这个序列分成两种:

  1. \(mx_i=mx_1\) 的点 \(i\)\(k+1\) 棵树中。

  2. 另一种情况。

对于第一种情况:

引理四:在这一种情况中,大于 \(mx_1\) 的个数等于 \(k-1\)

证明:

如果大于 \(mx_1\) 的个数大于 \(k-1\),则会导致多余的在前面已经填满 \(mx_i>mx_1\) 的数的情况下,有 \(mx_i>mx_1\) 的数到第 \(k+1\) 棵树中,导致第 \(k+1\) 树中的最大深度大于 \(mx_1\)

如果大于 \(mx_1\) 的个数小于 \(k-1\),这个会导致有 \(mx_i=mx_1\) 的数填进前 \(k\) 个树,所以“\(mx_i=mx_1\) 的点 \(i\)\(k+1\) 棵树中”的假设就不成立了。

这种情况的话,那么已经固定好了第了要从 \(k-1\) 个点中选 \(k-1\) 个了,所以答案累加 \((k-1)!\)

对于第二种情况:

引理五:一定要注意大于 \(mx_1\) 的个数一定要大于 \(k\)

证明:就是上面说的引理二的拓展。

那么答案直接累加在大于等于 \(mx_1\) 的数中选 \(k-1\) 排列的方案数减去大于 \(mx_1\) 的数中选 \(k-1\) 排列的方案数。

对于维护每一层大于 \(mx_i\) 的个数,就是建一个对于 \(mx\) 值的树状数组即可,记得一个一个减回去,不要memset,大佬们都直接排序。

说在最后:

在做这道题的时候,我一开始想的是分成要么它可以在第 \(k+1\) 棵树上有 \(mx_1\),要么不可以两种计数。

然后不可以的时候就直接在他相等的个数中选一个及其可以在的位置乘上其他点的排列,实际上这个东西会冲突,所以放弃了。

关于时间复杂度,有树状数组一个 \(log\),但无伤大雅,如果没有树状数组就是 $O(n),因为每一层的数是不重复的,且加起来一共就 \(n\) 个。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 1e6 + 5;
const ll mod = 998244353;
ll n;
ll dep[N], mx[N];
vector<ll> e[N];
vector<ll> ep[N];
void dfs(ll x) {mx[x] = dep[x];for (auto v : e[x]) {dep[v] = dep[x] + 1;dfs(v);mx[x] = max(mx[x], mx[v]);}ep[dep[x]].push_back(x);
}
ll jc[N * 2], inv[N * 2];
ll poww(ll a, ll b) {ll ans = 1;while (b) {if (b & 1)ans = (ans * a) % mod;a = (a * a) % mod;b >>= 1;}return ans;
}
ll A(ll n, ll m) {if(n<m)return 0;return jc[n] * inv[n - m] % mod;
}
ll tr[N];
#define lowbit(i) (i & -i)
void modify(ll x, ll y) {for (ll i = x; i <= n; i += lowbit(i)) tr[i] = (tr[i] + y);
}
ll ask(ll x) {ll cnt = 0;for (ll i = x; i >= 1; i -= lowbit(i)) cnt += tr[i];return cnt;
}
ll query(ll x) {return ask(n) - ask(x);
}
int main() {ll k;cin >> n >> k;jc[1] = inv[1] = 1;inv[0] = 1;for (ll i = 2; i <= n; i++) {jc[i] = jc[i - 1] * i % mod;inv[i] = poww(jc[i], mod - 2);}for (ll i = 2; i <= n; i++) {ll x;cin >> x;e[x].push_back(i);}dep[1] = 1;dfs(1);ll ans = 0;for (ll i = 1; i <= n; i++) {for (auto j : ep[i]) modify(mx[j], 1);for (auto j : ep[i]) {ll p = query(mx[j]);ll op = ask(mx[j]) - ask(mx[j] - 1);if (op >= 2) {ll cnt = 0;if(p+op-1>=k)  cnt = (cnt + A(p + op - 1, k - 1) - A(p, k - 1) + mod) % mod;if (p == k - 1)cnt = (cnt + jc[k - 1]) % mod;ans = (ans + cnt) % mod;}}for (auto j : ep[i]) modify(mx[j], -1);}cout << ans << '\n';return 0;
}

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

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

相关文章

10.23日学习笔记

一、应用层在 TCP/IP 中的位置 最顶层,直接为用户的应用程序提供网络服务。 不关心底下几层如何传输,只关心“消息语义”与“交换规则”。 典型交互模型: 客户/服务器(C/S) P2P(对等) 混合(边缘 P2P + 索引服务…

埃氏筛及扩展质因数筛——埃拉托斯特尼筛法变种

质数筛这段代码用 “埃拉托斯特尼筛法” 找 2 到 N 之间的所有素数,逻辑很直接:先假设所有数都是素数(用vis数组标记,初始全为true); 排除 0 和 1(它们不是素数,标记为false); 从 2 开始,对每个没被排除的数…

Day2路径,相对与绝对

路径指的是查找文件时,从起点到终点经历的路程 路径也分为绝对路径与相对路径 相对路径是从当前文件出发查找目标额文件 绝对路径是从盘符出发找目标文件 Windows电脑是从盘符出发的,而Mac电脑则是从根目录出发 在…

第九届强网杯线上赛PWN_flag-market

第九届强网杯线上赛PWN_flag-market第九届强网杯线上赛PWN_flag-market 一、题目二、信息搜集 下载题目给的附件,查看文件ctf.xinetd之后,知道我们的可执行程序名为chall:这个文件在附件中的bin目录下。 通过file命…

ISFB银行木马家族演化史:从Gozi到LDR4的技术剖析

本文深入分析ISFB银行木马家族十年演化历程,详细解析其技术架构、功能模块和分支变种,包括加载器、键盘记录、Web注入、VNC远程控制等核心功能,揭示网络犯罪组织的运作模式和技术演进。第1章 — 从Gozi到ISFB:一个…

exgcd板子

void exgcd(int &x,int &y,int a,int b) {if(!b){x=1;y=0;return;}exgcd(x,y,b,a%b);int t=x;x=y;y=t-a/b*y; }

2025.10.23

今天上午算法与数据结构的早八,然后跆拳道前半节课训练,后半节课进行体测,我对这次的成绩非常满意,中午没有点外卖,去食堂买了一个饼,回宿舍休息睡觉,晚上去科技楼制作本周六竞赛的PPT,一直到10点半。

Codeforces Round 976 (Div. 2) A. Find Minimum Operations

这个问题实际上是K进制取位和: 举例:2进制 n=110100 使用几次2的x次幂可以将n置0,ans=3 10进制 n=9924 使用几次10的x次幂可以将n置0,ans=9+9+2+4 k进制也相同 ,代码如下: `#include <bits/stdc++.h> using nam…

102302142罗伟钊第一次作业

1. 作业①: **1)、核心代码与输出 ** o 要求:用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。代码是一个大学排名数…

一个基于 .NET 开源、功能强大的分布式微服务开发框架

前言 今天大姚给大家分享一个基于 .NET 开源、功能强大的分布式微服务开发框架:Anno.Core。Anno.Core 项目介绍 Anno.Core 是一个基于 .NET 开源、功能强大的分布式微服务开发框架,致力于简化分布式、微服务系统的构…

UE4学习笔记

基本操作窗口这里可以打卡很多视口设置可以通过设置书签到自己想要的视角视口世界大纲

20251021 NOIP模拟赛

T2 题目大意; 有一棵大小为 \(n\) 的树和 \(m\) 个关键点,你要从这 \(m\) 个关键点中随机选择 \(k\) 个点,问这 \(k\) 个点两两之间最长距离的期望是多少。 \(n \le 2000, m \le 300\) 解题思路: 最暴力的做法肯定…

RocketMQ+Spring Boot的简单实现及其深入分析

Producer搭建导入RocketMQ依赖和配置RocketMQ地址及producer的group:name<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId>…

xcode程序创建文件存储位置

xcode创建的文件不在cpp文件所在位置,经过查找发现在下面这个地方/Users/用户名/Library/Developer/Xcode/DerivedData/employeesystem-dlmmqxmyqxjljjcoskekmpsbtstd/Build/Products/Debug employeesystem是项目名称…

欧拉操作系统搭建docker

欧拉安装dockerdocker官方没有支持欧拉的,因此使用的是centos7的docker源2者底层是类似的1、配置yum源和安装docker yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.re…

关于2025年暑假自主巡航小车脚本文件的学习笔记

脚本:gnome-terminal --window -e bash -c "roscore; exec bash" \ gnome-terminal命令用于新建一个GNOME桌面环境的终端程序(顶级窗口) 选项--window,新建一个窗口与默认行为一致(属于是显式写法,提高…

3dmax下载安装教程及激活教程(附安装包)3dmax2025超详细下载安装步骤

很多新手想装 3dmax 2025 却不知道从哪下手,别担心,这份 3dmax 2025 详细安装教程从下载到激活,再到软件用法,一步一步教你,保证看了就会,轻松解决 3dmax 2025 安装难题。目录3dmax 2025 到底好用在哪?3dmax 20…

RFSOC学习记录(五)带通采样定理

RFSOC学习记录(五),在配置adda的混频模式之前通过公式推导介绍了带通采样定理以及奈奎斯特分区​花了三篇文章的时间大致讲了讲我对于rfsoc时钟树的理解,非常的浅薄与浅应用,现在我再从原理层面记录一下我对于rf …

66页作业

点击查看代码 import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms import matplotlib.pyplot as plt import numpy as np# 设置设备 d…

NXP S32K118的FTM模块分析

背景介绍: FTM(fLexTimer Module)是NXP微控制器中常用的定时器模块,它设计用于生成复杂的PWM信号,输入捕获,输出比较等。 在同一个FTM模块内(FTM0),所有的通道(Channel 0到Channel n)都必须共用以下资源: 基…