当前位置: 首页 > news >正文

SCP2025T2:P14254 分割(divide) 题解

P14254 分割(divide)

题面上的 1 ≤ p i < i 1 \leq p_i < i 1pi<i 是不是有问题啊,应该是 1 ≤ p i ≤ i 1 \leq p_i \le i 1pii 吧,定义为:第 i i i 个正整数表示结点 ( i + 1 ) (i+1) (i+1) 的父结点的编号 p i p_i pi

思路

首先我们记以 i i i 为根的子树中深度最深的点的深度为 m i m_{i} mi,则 S i = [ d i , m i ] S_{i}=[d_{i},m_{i}] Si=[di,mi]。可以发现,如果 d b 1 < d b i ( 1 < i ≤ n ) d_{b_1}< d_{b_i}(1<i\le n) db1<dbi(1<in),那么 d b 1 ∉ S j d_{b_1}\notin S_{j} db1/Sj,求交集后一定不会满足条件二。故 d b 1 = d b 2 = ⋯ = d b k d_{b_1}=d_{b_2}=\dots=d_{b_k} db1=db2==dbk

我们把深度相同的点放进桶里,针对同一深度的点,从小到大枚举 m i m_{i} mi 的值。设 c n t cnt cnt 为相等的 m i m_{i} mi 的个数, p p p 为比 m i m_{i} mi 小的值的的个数, s s s 为比 m i m_{i} mi 大的值的个数。显然,比 m i m_{i} mi 小的值必然不可能成为被挖去的子树,如果挖去,那么交集后一定不会满足条件二。我们首先钦定一个 m i m_{i} mi b 1 b_1 b1,那么就是在剩下 s + c n t − 1 s+cnt-1 s+cnt1 个子树中选择 k − p − 1 k-p-1 kp1 个挖去,剩下的保留。有问题吗?当然有,如果所有相等的 m i m_{i} mi 都没有被挖去,且至少有一个比 m i m_{i} mi 大的没有被挖去,那么交集就不满足条件二了,减去这种情况即可。

代码

时间复杂度 O ( n log ⁡ M ) O(n\log_{}{M} ) O(nlogM),其中 M = 998244353 M=998244353 M=998244353,不过可以优化求逆元的复杂度可以得到 O ( n log ⁡ n ) O(n\log_{}{n} ) O(nlogn),懒得改了。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5,mod=998244353;
int n,k,dep[N],m[N],jie[N],ni[N];
vector<int> a[N],t[N];
void dfs(int x)
{m[x]=dep[x];for(int i=0;i<a[x].size();i++){dep[a[x][i]]=dep[x]+1;dfs(a[x][i]);m[x]=max(m[x],m[a[x][i]]);}t[dep[x]].push_back(m[x]);
}
int ksm(int x,int y)
{if(y==1) return x;long long mid=ksm(x,y>>1);if(y&1) return mid*mid%mod*x%mod;else return mid*mid%mod;
}
int C(int n,int m)
{if(m==0) return 1;if(n<m||n<0||m<0) return 0;return 1ll*jie[n]*ni[n-m]%mod*ni[m]%mod;
}
int main()
{ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n>>k;for(int i=2;i<=n;i++){int p;cin>>p;a[p].push_back(i);}jie[0]=1;for(int i=1;i<=n;i++)jie[i]=1ll*jie[i-1]*i%mod,ni[i]=ksm(jie[i],mod-2);//直接用的快速幂求逆元,时间稍微多些dep[1]=1;dfs(1);long long ans=0;for(int i=2;i<=n;i++){sort(t[i].begin(),t[i].end());for(int j=0;j<t[i].size();){int cnt=0,p=j;for(int d=j;d<t[i].size();d++)if(t[i][d]==t[i][j]) cnt++;else break;int s=t[i].size()-j-cnt;long long sum=C(s+cnt-1,k-1);if(s>k-1)sum=(sum-C(s,k-1))%mod;//在s中取k-1个挖去,剩下的给根节点,保证至少给根节点一个ans=(ans+sum*cnt%mod)%mod;//任意一个都可以当b1j+=cnt;}}ans=ans*jie[k-1]%mod;//序列b有序,要乘上排列数ans=(ans+mod)%mod;//涉及减法,可能出现负数cout<<ans;return 0;
}
http://www.dtcms.com/a/498782.html

相关文章:

  • LeetCode 3397. 执行操作后不同元素的最大数量
  • 零基础学AI大模型之RAG系统链路解析与Document Loaders多案例实战
  • 北京房产网站大全怎么查找关键词排名
  • 2025年--Lc201- 378. 有序矩阵中第 K 小的元素(排序)--Java版
  • 基于2015年背景下的长虹集团数字化转型案例分析-市场背景资料搜集与整理
  • eduAi-智能体创意平台
  • OpenCV编程入门:从零开始的计算机视觉之旅
  • 肇庆网站制作策划麦包包的网站建设
  • 分享一个基于微信小程序的个性化服装搭配推荐平台设计与实现,利用uniapp框架开发的跨平台女装穿搭小程序,源码、调试、答疑、lw、开题报告、ppt
  • 网站建设方案服务公司网站整体色调
  • 如何将喜欢的哔哩哔哩视频保存起来
  • 【OpenHarmony】HDF 核心框架
  • 如何通过中药电商平台实现药材全程可追溯?
  • 拖拽式构建智能体的框架
  • PHP 后台通过权限精制飞书多维表格
  • Conda 常用命令汇总(新手入门笔记)
  • 一流的商城网站建设好看的网站界面设计
  • 微服务之hystrix熔断降级和负载均衡
  • Docker(三) Docker基础前置
  • kubuntu24.04 fcitx5-rime输入法配置
  • Daemon: 系统中看不见的守护进程
  • 3-SpringCloud-LoadBalancer-OpenFeign服务调用与负载均衡
  • 百度推广进入后是别的网站 说是服务器问题上海嘉定网站建设公司
  • Photoshop - Photoshop 工具栏(12)横排文本工具
  • K8S(十五)—— 企业级K8s集群管理实践:Rancher安装配置与核心功能实操
  • 透明网站模板python基础代码
  • Linux网络HTTP(上)(7)
  • JavaScript 二维数组的三种定义与初始化方法
  • 网站开发过程中的方法wordpress文件上传下载
  • DataFun:智能风控与业务安全