Codeforces1929F Sasha and the Wedding Binary Search Tree
目录
- tags
- 中文题面
- 输入格式
- 输出格式
- 样例输入
- 样例输出
- 说明
- 思路
- 代码
tags
组合数 二叉搜索树
中文题面
定义一棵二叉搜索树满足,点有点权,左儿子的点权 ≤ \leq ≤ 根节点的点权,右儿子的点权 ≥ \geq ≥ 根节点的点权。
现在给定一棵 n n n 个点二叉搜索树的形态与一些点的权值;问有多少种填剩余点的点权的方法,使得所有点的点权都 ∈ [ 1 , C ] \in[1,C] ∈[1,C]。
输入格式
每个测试由多个测试用例组成。第一行包含一个整数 t t t ( 1 ≤ t ≤ 1 0 5 1 \le t \le 10^5 1≤t≤105 )——测试用例的数量。下面是测试用例的描述。
每个测试用例的第一行包含两个整数 n n n 和 C C C ( 2 ≤ n ≤ 5 ⋅ 1 0 5 2 \leq n \leq 5 \cdot 10^5 2≤n≤5⋅105 , 1 ≤ C ≤ 1 0 9 1 \leq C \leq 10^9 1≤C≤109 )——树中的顶点数和顶点上允许的最大值。
接下来的 n n n 行描述了树的顶点。 i i i 行包含三个整数 L i , R i L_i, R_i Li,Ri 和 v a l i val_i vali ( − 1 ≤ L i , R i ≤ n -1 \le L_i, R_i \le n −1≤Li,Ri≤n , − 1 ≤ v a l i ≤ C -1 \le val_i \le C −1≤vali≤C , L i , R i , v a l i ≠ 0 L_i, R_i, val_i \ne 0 Li,Ri,vali=0 )——分别是左子节点的个数、右子节点的个数和 i i i 顶点处的值。如果是 L i = − 1 L_i = -1 Li=−1,那么 i i i 顶点没有左子顶点。如果是 R i = − 1 R_i = -1 Ri=−1,那么 $ i $ 顶点没有右子。如果是 v a l i = − 1 val_i = -1 vali=−1,那么第 i i i 顶点处的值是未知的。
保证至少存在一棵合适的二叉搜索树。
可以保证所有测试用例 n n n 的总和不超过 5 ⋅ 1 0 5 5 \cdot 10^5 5⋅105。
输出格式
对于每个测试用例,输出一个整数——合适的二叉搜索树的个数对 998244353 998244353 998244353 取模。
样例输入
3
5 5
2 3 -1
-1 -1 2
4 -1 3
-1 5 -1
-1 -1 -1
3 69
2 3 47
-1 -1 13
-1 -1 69
3 3
2 3 -1
-1 -1 -1
-1 -1 -1
样例输出
4
1
10
说明
在第一个测试用例中,二叉搜索树具有以下形式:

那么在顶点的可能值是: [ 2 , 2 , 3 , 2 , 2 ] [2,2,3,2,2] [2,2,3,2,2], [ 2 , 2 , 3 , 2 , 3 ] [2,2,3,2,3] [2,2,3,2,3], [ 2 , 2 , 3 , 3 , 3 ] [2,2,3,3,3] [2,2,3,3,3], [ 3 , 2 , 2 , 3 , 3 ] [3,2,2,3,3] [3,2,2,3,3], [ 3 , 2 , 2 , 3 , 3 ] [3,2,2,3,3] [3,2,2,3,3], [ 3 , 2 , 2 , 3 , 3 ] [3,2,2,3,3] [3,2,2,3,3]。
在第二个测试用例中,所有顶点的值都是已知的,因此只有一个合适的二叉搜索树。
思路
首先我们可以想到二叉搜索树的性质:中序遍历整个二叉搜索树得到它的序列,这个序列是不减的,即对于 1 ≤ i ≤ j ≤ n 1\le i \le j \le n 1≤i≤j≤n 有 a i ≤ a j a_i\le a_j ai≤aj,接下来我们只需要填充无值的点(即 v a l = − 1 val=-1 val=−1)即可。
举个例子,比如在样例一中中序遍历得到 [ 2 , − 1 , − 1 , − 1 , 3 ] [2,-1,-1,-1,3] [2,−1,−1,−1,3],那么 a 2 , a 3 , a 4 a_2,a_3,a_4 a2,a3,a4 需要填值,值域为 [ m a x ( 1 , a 1 ) , m i n ( C , a 5 ) ] = [ 2 , 3 ] [max(1, a_1), min(C,a_5)]=[2,3] [max(1,a1),min(C,a5)]=[2,3]。
事实上这是个经典组合数问题,设值域为 [ l , r ] [l, r] [l,r],待填位置有 x x x 个,那么 填数方案数 = C ( r − l + x , x ) \text{填数方案数}=C(r-l+x, x) 填数方案数=C(r−l+x,x),用暴力算组合数即可解决,因为
- C ( n , x ) = n ! ( n − x ) ! x ! = ∏ n − x + 1 n i x ! C(n, x)=\frac{n!}{(n-x)!x!}=\frac{∏_{n-x+1}^ni}{x!} C(n,x)=(n−x)!x!n!=x!∏n−x+1ni
发现实际上暴力算组合数能够在 O ( x ) O(x) O(x) 的时间复杂度内解决,而本题限制了 ∑ n ≤ 5 × 1 0 5 ∑ n \le 5\times10^5 ∑n≤5×105, x x x 最多取到 n n n,不会超时。
代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define N (int)5e5 + 5
#define pdd pair<double, double>
#define pii pair<int, int>
#define l first
#define r secondint a, b, c, d, x, y, n, m, t, k, q, z, h;
int v[N], rd[N];
int p[N];
pii g[N];
const int mod = 998244353;
const int mmd = 114514;
vector<int> G;
string s;
map<int, int> mp;
void dfs(int now) {if (g[now].l!=-1) dfs(g[now].l);G.push_back(v[now]);if (g[now].r!=-1) dfs(g[now].r);
}
int qpow(int a, int b) {a %= mod;int ans = 1;for (; b; b>>=1) {if (b & 1) ans *= a, ans%=mod;a *= a, a%=mod;}return ans;
}
int C(int n, int m) {// n!/(n-m)!m!int zi = 1;for (int i = n; i > n - m; i--) zi *= i, zi %= mod;return zi * qpow(p[m], mod-2) % mod;
}
signed main() {ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);p[0] = p[1] = 1;for (int i = 2; i <= 5e5; i++) p[i] = p[i - 1] * i, p[i] %= mod;cin >> t;while (t--) {cin >> n >> c;G.clear();for (int i = 1; i <= n; i++) rd[i] = 0, g[i].l = g[i].r = -1, v[i] = -1;for (int i = 1; i <= n; i++) {cin >> g[i].l >> g[i].r >> v[i];if (g[i].l!=-1) rd[g[i].l]++;if (g[i].r!=-1) rd[g[i].r]++;}for (int i = 1; i <= n; i++) {if (rd[i]==0) {dfs(i);break;}}int res = 1;for (int i = 0; i < G.size(); i++) {if (G[i] == -1) {int ll = i;int rr = 0;int kua = -1;for (int j = i + 1; j < G.size(); j++) {if (G[j] != -1) {kua = G[j] - (i - 1 >= 0 ? G[i - 1] : 1);rr = j;i = j;break;}}if (kua == -1) {rr = G.size();kua = c - (i - 1 >= 0 ? G[i - 1] : 1);i = G.size();}res *= C(rr-ll+kua, rr-ll);res %= mod;}}cout << res << '\n';}return 0;
}相关文章:
Codeforces1929F Sasha and the Wedding Binary Search Tree
目录 tags中文题面输入格式输出格式样例输入样例输出说明 思路代码 tags 组合数 二叉搜索树 中文题面 定义一棵二叉搜索树满足,点有点权,左儿子的点权 ≤ \leq ≤ 根节点的点权,右儿子的点权 ≥ \geq ≥ 根节点的点权。 现在给定一棵 …...
HBuilder X 使用 TortoiseSVN 设置快捷键方法
HBuilder X 使用 TortoiseSVN 设置快捷键方法 单文件:(上锁,解锁,提交,更新) 安装好 TortoiseSVN ,或者 按图操作: 1,工具栏中 【自定义快捷键】 2,点击 默认的快捷键设置&…...
Java jar包后台运行方式详解
目录 一、打包成 jar 文件二、后台运行 jar 文件三、示例四、总结在 Java 开发中,我们经常需要将应用程序打包成可执行的 jar 文件,并在后台运行。这种方式对于部署长时间运行的任务或需要持续监听事件的应用程序非常重要。本文将详细介绍如何实现 Java jar 包的后台运行,并…...
Refreshtoken 前端 安全 前端安全方面
网络安全 前端不需要过硬的网络安全方面的知识,但是能够了解大多数的网络安全,并且可以进行简单的防御前两三个是需要的 介绍一下常见的安全问题,解决方式,和小的Demo,希望大家喜欢 网络安全汇总 XSSCSRF点击劫持SQL注入OS注入请求劫持DDOS 在我看来,前端可以了解并且防御前…...
Mysql5.7-yum安装和更改mysql数据存放路径-2020年记录
记录下官网里用yum rpm源安装mysql, 1 官网下载rpm https://dev.mysql.com/downloads/repo/yum/ https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html(附官网操作手册) wget https://repo.mysql.com//mysql80-community-release…...
[项目]基于FreeRTOS的STM32四轴飞行器: 七.遥控器按键
基于FreeRTOS的STM32四轴飞行器: 七.遥控器 一.遥控器按键摇杆功能说明二.摇杆和按键的配置三.按键扫描 一.遥控器按键摇杆功能说明 两个手柄四个ADC。 左侧手柄: 前后推为飞控油门,左右推为控制飞机偏航角。 右侧手柄: 控制飞机飞行方向&a…...
Android15使用FFmpeg解码并播放MP4视频完整示例
效果: 1.编译FFmpeg库: 下载FFmpeg-kit的源码并编译生成安装平台库 2.复制生成的FFmpeg库so文件与包含目录到自己的Android下 如果没有prebuiltLibs目录,创建一个,然后复制 包含目录只复制arm64-v8a下...
numpy常用函数详解
在深度神经网络代码中经常用到numpy库的一些函数,很多看过之后很容易忘记,本文对经常使用的函数进行归纳总结。 np.arange arange是numpy一个常用的函数,该函数主要用于创建等差数列。它的使用方法如下所示: numpy.arange([star…...
安装树莓派3B+环境(嵌入式开发)
一、环境配置 1、下载树莓派镜像工具 点击进入下载连接 进入网站,点击下载即可。 2、配置wifi及ssh 将SD卡插入读卡器,再接入电脑,随后打开Raspberry Pi Imager下载工具, 选择Raspberry Pi 3 选择64位的操作系统 选择SD卡 选择…...
深度学习/强化学习调参技巧
深度调优策略 1. 学习率调整 技巧:学习率是最重要的超参数之一。过大可能导致训练不稳定,过小则收敛速度慢。可以使用学习率衰减(Learning Rate Decay)或自适应学习率方法(如Adam、RMSprop)来动态调整学习…...
p5.js:sound(音乐)可视化,动画显示音频高低变化
本文通过4个案例介绍了使用 p5.js 进行音乐可视化的实践,包括将音频振幅转化为图形、生成波形图。 承上一篇:vite:初学 p5.js demo 画圆圈 cd p5-demo copy .\node_modules\p5\lib\p5.min.js . copy .\node_modules\p5\lib\addons\p5.soun…...
Linux下安装elasticsearch(Elasticsearch 7.17.23)
Elasticsearch 是一个分布式的搜索和分析引擎,能够以近乎实时的速度存储、搜索和分析大量数据。它被广泛应用于日志分析、全文搜索、应用程序监控等场景。 本文将带你一步步在 Linux 系统上安装 Elasticsearch 7.17.23 版本,并完成基本的配置࿰…...
plt和cv2有不同的图像表示方式和颜色通道顺序
在处理图像时,matplotlib.pyplot (简称 plt) 和 OpenCV (简称 cv2) 有不同的图像表示方式和颜色通道顺序。了解这些区别对于正确处理和显示图像非常重要。 1. 图像形状和颜色通道顺序 matplotlib.pyplot (plt) 形状:plt 通常使用 (height, width, cha…...
【The Rap of China】2018
中国新说唱第一季,2018 2018年4月13日,该节目通过官方微博宣布,其第二季将更名为《中国新说唱》。 《中国新说唱2018》由张震岳、MC Hotdog、潘玮柏、邓紫棋、WYF 担任明星制作人; 艾热获得冠军、那吾克热玉素甫江获得亚军、ICE…...
通义万相2.1开源版本地化部署攻略,生成视频再填利器
2025 年 2 月 25 日晚上 11:00 通义万相 2.1 开源发布,前两周太忙没空搞它,这个周末,也来本地化部署一个,体验生成效果如何,总的来说,它在国内文生视频、图生视频的行列处于领先位置,…...
YOLOv10改进之MHAF(多分支辅助特征金字塔)
YOLOv10架构 YOLOv10的架构主要由 主干网络、特征金字塔和预测头 三部分组成。主干网络采用改进的Darknet结构,增强特征提取能力。特征金字塔模块使用多尺度特征融合技术,提高对不同大小目标的检测效果。预测头则负责生成最终的检测结果。这种结构设计使得YOLOv10在保持高效…...
好玩的谷歌浏览器插件-自定义谷歌浏览器光标皮肤插件-Chrome 的自定义光标
周末没有啥事 看到了一个非常有意思的插件 就是 在使用谷歌浏览器的时候,可以把鼠标的默认样式换一个皮肤。就像下面的这种样子。 实际谷歌浏览器插件开发对于有前端编程基础的小伙伴 还是比较容易的,实际也是写 html css js 。 所以这个插件使用的技术…...
svn删除所有隐藏.svn文件,文件夹脱离svn控制
新建一个文件,取名remove-svn-folders.reg,输入如下内容: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN] "Delete SVN Folders" [HKEY_LOCAL_MACHINE\SOFTWARE\Class…...
六十天前端强化训练之第十二天之闭包深度解析
欢迎来到编程星辰海的博客讲解 目录 第一章:闭包的底层运行机制 1.1 词法环境(Lexical Environment)的构成JavaScript 引擎通过三个关键组件管理作用域: 1.2 作用域链的创建过程当函数被定义时: 1.3 闭包变量的生命…...
DeepSeek R1-32B医疗大模型的完整微调实战分析(全码版)
DeepSeek R1-32B微调实战指南 ├── 1. 环境准备 │ ├── 1.1 硬件配置 │ │ ├─ 全参数微调:4*A100 80GB │ │ └─ LoRA微调:单卡24GB │ ├── 1.2 软件依赖 │ │ ├─ PyTorch 2.1.2+CUDA │ │ └─ Unsloth/ColossalAI │ └── 1.3 模…...
10.2 继承与多态
文章目录 继承多态 继承 继承的作用是代码复用。派生类自动获得基类的除私有成员外的一切。基类描述一般特性,派生类提供更丰富的属性和行为。在构造派生类时,其基类构造函数先被调用,然后是派生类构造函数。在析构时顺序刚好相反。 // 基类…...
[网络爬虫] 动态网页抓取 — Selenium 元素定位
🌟想系统化学习爬虫技术?看看这个:[数据抓取] Python 网络爬虫 - 学习手册-CSDN博客 在使用 Selenium 时,往往需要先定位到指定元素,然后再执行相应的操作。例如,再向文本输入框中输入文字之前,…...
静态网页的爬虫(以电影天堂为例)
一、电影天堂的网址(url) 电影天堂_免费电影_迅雷电影下载_电影天堂网最好的迅雷电影下载网,分享最新电影,高清电影、综艺、动漫、电视剧等下载!https://dydytt.net/index.htm 我们要爬取这个页面上的内容 二、代码…...
将图片存储至阿里云 OSS
将图片存储至阿里云 OSS 一、概述 在项目开发中,我们常常需要处理用户上传的图片。本文将介绍如何使用前端的 el-upload 组件将照片上传到后端,后端再将照片存储到阿里云 OSS,并最终返回图片的 URL 给前端。 二、前端实现 1. 安装依赖 确…...
Android设备是如何进入休眠的呢?
首先我们手机灭屏后,一般需要等一段时间CPU才真正进入休眠。即Android设备屏幕暗下来的时候,并不是立即就进入了休眠模式;当所有唤醒源都处于de-avtive状态后,系统才会进入休眠。在手机功耗中从灭屏开始到CPU进入休眠时间越短&…...
ctfshow做题笔记—栈溢出—pwn65~pwn68
目录 前言 一、pwn65(你是一个好人) 二、pwn66(简单的shellcode?不对劲,十分得有十二分的不对劲) 三、pwn67(32bit nop sled)(确实不会) 四、pwn68(64bit nop sled) 前言 做起来比较吃力哈哈,自己还是太菜了&…...
高效处理 List<T> 集合:更新、查找与优化技巧
引言 在日常开发中,List<T> 是我们最常用的数据结构之一。无论是批量更新数据、查找特定项还是进行复杂的集合操作,掌握 List<T> 的高级用法可以显著提高代码的效率和可读性。本文将详细介绍如何使用 List<T> 进行批量更新、查找匹配项以及优化性能的方法…...
Java基础系列:深入解析final与static关键字的奥秘与避坑指南
目录 一、final关键字的四重境界 1. 修饰常量(成员变量/局部变量) 2. 修饰方法(禁止重写) 3. 修饰类(禁止继承) 4. 并发控制(内存屏障) 二、static关键字的四维空间 1. 静态变…...
django各种mixin用法
在 Django 中,Mixin 是一种用于扩展类功能的设计模式。通过 Mixin,可以在不修改原有类的情况下,为其添加新的方法或属性。Django 中的 Mixin 广泛应用于视图(View)、表单(Form)、模型(Model)等组件中。以下是 Django 中常见 Mixin 的用法和示例: 一、视图(View)中的…...
JS中的闭包(closures)一种强大但易混淆的概念
JavaScript 中的闭包(closures)被认为是一种既强大又易混淆的概念。闭包允许函数访问其外部作用域的变量,即使外部函数已执行完毕,这在状态维护和回调函数中非常有用。但其复杂性可能导致开发者的误解,尤其在变量捕获和…...
