P5689 [CSP-S2019 江西] 多叉堆
P5689 [CSP-S2019 江西] 多叉堆
题意
维护一组树,有如下两种操作:
- 令 \(x\) 所在子树的根的父亲为 \(y\) 所在子树的根。
- 求 \(x\) 所在子树被 \(0\) 到 \(size-1\) 填满能形成的不同多叉堆的数量(\(size\) 为 \(x\) 所在子树大小)。
题解
看到操作一,显然是并查集。
再看操作二,说明并查集要维护一个 \(size\) 和一个答案 \(f\),并且 \(f\) 肯定只和 \(size\) 有关。
回到操作一,考虑 \(f\) 怎么合并。首先合并完的树根只能是 \(0\),剩下的数字实际上可以随便分配给 \(x\) 和 \(y\) 所在的子树,分配完之后 \(x\) 和 \(y\) 所在子树的 \(f\) 实际上就独立了,根据乘法原理相乘即可。
形式上:
\]
组合数预处理一下阶乘及其逆元即可,代码十分清晰。
代码
#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 江西] 多叉堆的更多相关文章
- AC日记——二叉堆练习3 codevs 3110
3110 二叉堆练习3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 给定N(N≤500,000)和N个整 ...
- codevs 3110 二叉堆练习3
3110 二叉堆练习3 http://codevs.cn/problem/3110/ 题目描述 Description 给定N(N≤500,000)和N个整数(较有序),将其排序后输出. 输入描述 I ...
- 数据结构图文解析之:二叉堆详解及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆
考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...
- 二叉堆(一)之 图文解析 和 C语言的实现
概要 本章介绍二叉堆,二叉堆就是通常我们所说的数据结构中"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本 ...
- 二叉堆(二)之 C++的实现
概要 上一章介绍了堆和二叉堆的基本概念,并通过C语言实现了二叉堆.本章是二叉堆的C++实现. 目录1. 二叉堆的介绍2. 二叉堆的图文解析3. 二叉堆的C++实现(完整源码)4. 二叉堆的C++测试程 ...
- 二叉堆(三)之 Java的实现
概要 前面分别通过C和C++实现了二叉堆,本章给出二叉堆的Java版本.还是那句话,它们的原理一样,择其一了解即可. 目录1. 二叉堆的介绍2. 二叉堆的图文解析3. 二叉堆的Java实现(完整源码) ...
- 二叉堆(binary heap)
堆(heap) 亦被称为:优先队列(priority queue),是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因 ...
- 在A*寻路中使用二叉堆
接上篇:A*寻路初探 GameDev.net 在A*寻路中使用二叉堆 作者:Patrick Lester(2003年4月11日更新) 译者:Panic 2005年3月28日 译者序 这一篇文章,是&q ...
- 《Algorithms算法》笔记:优先队列(2)——二叉堆
二叉堆 1 二叉堆的定义 堆是一个完全二叉树结构(除了最底下一层,其他层全是完全平衡的),如果每个结点都大于它的两个孩子,那么这个堆是有序的. 二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组 ...
随机推荐
- MybatisPlus - CodeGenerator
保存一下之前做系统的时候用到的生成器 先是导包 import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; import ...
- Rust 修仙之道 第一章 灵值初开 · 掌握变量与函数的灵气流动
第一章:灵值初开 · 掌握变量与函数的灵气流动 那一年,顾行云尚是初入灵道的"代码童子",寄居在俗世码农村.他常听村中老人谈及一部残缺古卷,记载着失传已久的灵术之语--Rust经. ...
- nodejs 原生服务起一个httpServer
离开express.koa.egg 你还会利用原生node写后端的http服务吗? 定义路由和返回 这里有一个例子,原生node起http服务. 返回了静态页面文件.字符串拼接的html,json对象 ...
- 前端开发系列027-基础篇之Canvas绘图(图像)
本文将介绍Canvas画布图像绘制相关的技术细节. 一.Canvas画布图像绘制基础 核心API 绘制图像 语法 ctx.drawImage(image,dx,dy); ctx.drawImage(i ...
- FastCDC 项目启动玩玩 😁😁😁😁
我一直想写个轻量级,但是又高性能,能包含各种国外和国产数据库的迁移和同步工具,然后开源. 无奈以前一直没时间,所以一直没干. 但是现在有时间了,昨天就开始干了. 实现的第一个功能是,Oracle 数据 ...
- ETLCloud结合kafka的数据集成
一.ETLCloud中实时数据集成的使用 在ETLCloud中数据集成有两种方式,一种是离线数据集成,另一种便是我们今天所要介绍的实时数据集成了,两者的区别从名字便可以得知,前者处理的数据是离线的没有 ...
- Jupyter虚拟环境创建和Deepseek API调用
目录 创建运行环境 启动jupyter交互环境 调用Deepseek API 总结 "如果改变不了环境,那就改变自己去适应环境!" python的IDE和交互工具有很多,本人开发p ...
- SciTech-BigDataAIML-Tensorflow-Keras的API列表 + TensorFlow 模型建立与训练
Tensorflow链接: https://www.tensorflow.org/install https://www.tensorflow.org/guide https://www.tensor ...
- sql优化谓词下推在join场景中的应用
本文分享自天翼云开发者社区<sql优化谓词下推在join场景中的应用>,作者:i****n 列裁剪(分区裁剪):将为查询的字段以及分区过滤,从而减少加载的数据量. Map端聚合配置:在ma ...
- MAUI学习记录
.NET MAUI学习笔记 参考文档 需创建新项目,可以点击上面的链接,进行查看 CommunityToolkit.Mvvm 官网文档 本次学习使用的是8.0.0版本,进行学习基础知识 第一步:功能实 ...