P5689 [CSP-S2019 江西] 多叉堆

题意

维护一组树,有如下两种操作:

  • 令 \(x\) 所在子树的根的父亲为 \(y\) 所在子树的根。
  • 求 \(x\) 所在子树被 \(0\) 到 \(size-1\) 填满能形成的不同多叉堆的数量(\(size\) 为 \(x\) 所在子树大小)。

题解

看到操作一,显然是并查集。

再看操作二,说明并查集要维护一个 \(size\) 和一个答案 \(f\),并且 \(f\) 肯定只和 \(size\) 有关。

回到操作一,考虑 \(f\) 怎么合并。首先合并完的树根只能是 \(0\),剩下的数字实际上可以随便分配给 \(x\) 和 \(y\) 所在的子树,分配完之后 \(x\) 和 \(y\) 所在子树的 \(f\) 实际上就独立了,根据乘法原理相乘即可。

形式上:

\[f_y \leftarrow f_y \times f_x \times \binom{f_x+f_y-1}{f_x}
\]

组合数预处理一下阶乘及其逆元即可,代码十分清晰。

代码

#include <bits/stdc++.h>
#define int long long using namespace std;
const int N=3e5+5;
const int mod=1e9+7; int n,q,ans;
int fac[N],invf[N]; int C(int x,int y){
return fac[y]*invf[x]%mod*invf[y-x]%mod;
} struct DSU{
int fa[N],sz[N],f[N];
void init(int n){for(int i=0;i<n;i++) fa[i]=i,sz[i]=f[i]=1;}
int find(int x){
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
void merge(int x,int y){
int fx=find(x),fy=find(y);
if(fx==fy) return;
fa[fx]=fy;
f[fy]=f[fy]*f[fx]%mod*C(sz[fx],sz[fx]+sz[fy]-1)%mod;
sz[fy]=(sz[fy]+sz[fx])%mod;
}
int ask(int x){
return f[find(x)];
}
}dsu; int ksm(int a,int b){
int res=1;
while(b){
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
} void Init(){
fac[0]=invf[0]=1;
for(int i=1;i<=N-5;i++) fac[i]=fac[i-1]*i%mod,invf[i]=ksm(fac[i],mod-2);
} signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
Init();
cin>>n>>q;
dsu.init(n);
ans=0;
while(q--){
int op,x,y;
cin>>op;
if(op==1){
cin>>x>>y;
x=(x+ans)%n;
y=(y+ans)%n;
dsu.merge(x,y);
}else{
cin>>x;
x=(x+ans)%n;
ans=dsu.ask(x);
cout<<ans<<"\n";
}
}
return 0;
}

P5689 [CSP-S2019 江西] 多叉堆的更多相关文章

  1. AC日记——二叉堆练习3 codevs 3110

    3110 二叉堆练习3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 给定N(N≤500,000)和N个整 ...

  2. codevs 3110 二叉堆练习3

    3110 二叉堆练习3 http://codevs.cn/problem/3110/ 题目描述 Description 给定N(N≤500,000)和N个整数(较有序),将其排序后输出. 输入描述 I ...

  3. 数据结构图文解析之:二叉堆详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  4. POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆

    考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...

  5. 二叉堆(一)之 图文解析 和 C语言的实现

    概要 本章介绍二叉堆,二叉堆就是通常我们所说的数据结构中"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本 ...

  6. 二叉堆(二)之 C++的实现

    概要 上一章介绍了堆和二叉堆的基本概念,并通过C语言实现了二叉堆.本章是二叉堆的C++实现. 目录1. 二叉堆的介绍2. 二叉堆的图文解析3. 二叉堆的C++实现(完整源码)4. 二叉堆的C++测试程 ...

  7. 二叉堆(三)之 Java的实现

    概要 前面分别通过C和C++实现了二叉堆,本章给出二叉堆的Java版本.还是那句话,它们的原理一样,择其一了解即可. 目录1. 二叉堆的介绍2. 二叉堆的图文解析3. 二叉堆的Java实现(完整源码) ...

  8. 二叉堆(binary heap)

    堆(heap) 亦被称为:优先队列(priority queue),是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因 ...

  9. 在A*寻路中使用二叉堆

    接上篇:A*寻路初探 GameDev.net 在A*寻路中使用二叉堆 作者:Patrick Lester(2003年4月11日更新) 译者:Panic 2005年3月28日 译者序 这一篇文章,是&q ...

  10. 《Algorithms算法》笔记:优先队列(2)——二叉堆

    二叉堆 1 二叉堆的定义 堆是一个完全二叉树结构(除了最底下一层,其他层全是完全平衡的),如果每个结点都大于它的两个孩子,那么这个堆是有序的. 二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组 ...

随机推荐

  1. MybatisPlus - CodeGenerator

    保存一下之前做系统的时候用到的生成器 先是导包 import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; import ...

  2. Rust 修仙之道 第一章 灵值初开 · 掌握变量与函数的灵气流动

    第一章:灵值初开 · 掌握变量与函数的灵气流动 那一年,顾行云尚是初入灵道的"代码童子",寄居在俗世码农村.他常听村中老人谈及一部残缺古卷,记载着失传已久的灵术之语--Rust经. ...

  3. nodejs 原生服务起一个httpServer

    离开express.koa.egg 你还会利用原生node写后端的http服务吗? 定义路由和返回 这里有一个例子,原生node起http服务. 返回了静态页面文件.字符串拼接的html,json对象 ...

  4. 前端开发系列027-基础篇之Canvas绘图(图像)

    本文将介绍Canvas画布图像绘制相关的技术细节. 一.Canvas画布图像绘制基础 核心API 绘制图像 语法 ctx.drawImage(image,dx,dy); ctx.drawImage(i ...

  5. FastCDC 项目启动玩玩 😁😁😁😁

    我一直想写个轻量级,但是又高性能,能包含各种国外和国产数据库的迁移和同步工具,然后开源. 无奈以前一直没时间,所以一直没干. 但是现在有时间了,昨天就开始干了. 实现的第一个功能是,Oracle 数据 ...

  6. ETLCloud结合kafka的数据集成

    一.ETLCloud中实时数据集成的使用 在ETLCloud中数据集成有两种方式,一种是离线数据集成,另一种便是我们今天所要介绍的实时数据集成了,两者的区别从名字便可以得知,前者处理的数据是离线的没有 ...

  7. Jupyter虚拟环境创建和Deepseek API调用

    目录 创建运行环境 启动jupyter交互环境 调用Deepseek API 总结 "如果改变不了环境,那就改变自己去适应环境!" python的IDE和交互工具有很多,本人开发p ...

  8. SciTech-BigDataAIML-Tensorflow-Keras的API列表 + TensorFlow 模型建立与训练

    Tensorflow链接: https://www.tensorflow.org/install https://www.tensorflow.org/guide https://www.tensor ...

  9. sql优化谓词下推在join场景中的应用

    本文分享自天翼云开发者社区<sql优化谓词下推在join场景中的应用>,作者:i****n 列裁剪(分区裁剪):将为查询的字段以及分区过滤,从而减少加载的数据量. Map端聚合配置:在ma ...

  10. MAUI学习记录

    .NET MAUI学习笔记 参考文档 需创建新项目,可以点击上面的链接,进行查看 CommunityToolkit.Mvvm 官网文档 本次学习使用的是8.0.0版本,进行学习基础知识 第一步:功能实 ...