Educational Codeforces Round 160 (Rated for Div. 2) D. Array Collapse(笛卡尔树+DP)

原题链接:D. Array Collapse


题目大意:


给你一个长度为 n n n 的排列 p p p ,排列的定义为 [ 1 , 2 , 3 , . . , n ] [1,2,3,..,n] [1,2,3,..,n] 中每个数都出现 恰好 一次。

你可以做 任意多次 这样的操作:

选出一个任意长度的子数组(数组中连续的一段),保留其最小的元素,并将其他元素从数组中删去。

现在询问你,按上面的方法操作之后,最终可以获得多少个互不相同的数组,答案对 998 998 998 244 244 244 353 353 353 取模后输出。

解题思路:


我们可以发现一个事实:

因为每次都是保留一个最小元素,假设我们想要保留某一个元素在最终数组里,那么我们只能删除它两边比它大的元素。

假设数组为: [ 4 , 3 , 5 , 2 , 1 , 8 , 6 , 7 ] [4,3,5,2,1,8,6,7] [4,3,5,2,1,8,6,7]

3 3 3 只能删除 [ 1 , 3 ] [1,3] [1,3] 区间的元素, 2 2 2 只能删除 [ 1 , 4 ] [1,4] [1,4] 区间的元素,而最小值 1 1 1 可以把区间 [ 1 , 8 ] [1,8] [1,8] 的元素全都删完,这里的删完是指的是除了自己以外的元素。

我们发现,每个点都管辖着一个区间,我们可以联想到 笛卡尔树 。

比如我们按照下标满足二叉搜索树,权值满足小根堆的方式按照上面的数组,所构建出来的笛卡尔树就是:

在这里插入图片描述
一个节点的子树就是他能管辖到的位置。

这样,我们就能对每个节点管辖到的左右子树进行分类讨论了。

  • 对管辖了 [ 1 , n ] [1,n] [1,n] 的根结点 1 1 1 无论如何也不能删去,没有贡献。
  • 一个节点 u u u 而言,如果我们要保留它,显然它的左右子树的方案是独立的,因此保留它的方案数有 a n s l × a n s r ansl \times ansr ansl×ansr 种。
  • 假设不保留它,而且它管辖了 [ 1 , x ] [1,x] [1,x] 的一段区间,说明它是其左边的最小值,比如 3 3 3 。我们左边没有比我们更小的数来删掉节点 u u u 了,因此我们只能被右边比我们小的 2 2 2 删去,右子树会被随之吞并,而左子树是独立的,所以方案数有 a n s l ansl ansl 种。
  • 假设不保留它,而且它管辖了 [ x , n ] [x,n] [x,n] 的一段区间,说明它是其右边的最小值,比如 6 6 6 。我们右边没有比我们更小的数来删掉节点 u u u 了,因此我们只能被左边比我们小 1 1 1 的删去,左子树会被随之吞并,而右子树是独立的,所以方案数有 a n s r ansr ansr 种。
  • 假设不保留它,而且它管辖了 [ x , y ] [x,y] [x,y] 的一段区间,说明它左右都有比他小的值 。我们既可以被左节点删除,又可以被右节点删除,所以方案数有 a n s l + a n s r − 1 ansl+ansr-1 ansl+ansr1 种。(首先左右子树是独立的,我们点 u u u 被左边删了,而右子树有一个全删完的方案,此时我们计算了一个删空点 u u u 整个子树的方案。而我们被右边删了,左子树有一个全删完的方案,此时我们又计算了一次删空点 u u u 的方案,点 u u u 的子树空被计算了两次,所以要减去 1 1 1

我们只需要从 1 1 1 开始,然后跑递归处理每个点作为子树的方案值,回溯过程中 D P DP DP 即可。

时间复杂度: O ( n ) O(n) O(n)

AC代码:

#include <bits/stdc++.h>
using namespace std;using PII = pair<int, int>;
using i64 = long long;template<class Ty>
struct CartesianTree {vector<int> stk;vector<int> L, R;CartesianTree() {}tuple<int, vector<int>, vector<int>> work(const vector<Ty>& A) {L.assign(A.size(), 0), R.assign(A.size(), 0);int n = A.size() - 1;for (int i = 1; i <= n; ++i) {int lst = 0;while (stk.size() && A[stk.back()] > A[i]) {lst = stk.back();stk.pop_back();}if (stk.size()) {R[stk.back()] = i;}if (lst) {L[i] = lst;}stk.emplace_back(i);}return {stk[0], L, R};}
};const int mod = 998244353;void solve() {int n;cin >> n;vector<int> arr(n + 1);for (int i = 1; i <= n; ++i) {cin >> arr[i];}CartesianTree<int> T;auto [root, L, R] = T.work(arr);auto DFS = [&](auto self, int u, int l, int r) -> i64 {i64 ansl = 1, ansr = 1;if (L[u]) ansl = self(self, L[u], l, u - 1);//有左子树就去左子树if (R[u]) ansr = self(self, R[u], u + 1, r);//有右子树就去右子树i64 ans = ansl * ansr % mod;//保留根的答案//删除根的答案if (l == 1 && r == n);//跳过根节点else if (l == 1) {//只能被右边删ans += ansl;} else if (r == n) {//只能被左边删ans += ansr;} else {//左右都能删ans += ansl;ans += ansr;ans -= 1;}return (ans + mod) % mod;};cout << DFS(DFS, root, 1, n) << '\n';
}signed main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int t = 1; cin >> t;while (t--) solve();return 0;
}

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

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

相关文章

unity导航网格无法烘培到台阶和斜坡

如图是我在b站学Unity导航网格时建的一个示例场景&#xff0c;本场景使用的为棱长1m的立方体&#xff0c;读者可以以此为参照度量其他物体大小。 可见导航网格根本无法烘焙到斜坡和台阶上&#xff0c;为解决问题我做了不少尝试&#xff0c;调整最大坡度和步高都没办法解决问题…

AI新纪元:可能的盈利之道

本文来源于Twitter大神宝玉&#xff08;dotey&#xff09;在聊 Sora 的时候&#xff0c;总结了 Sora 的价值和可能的盈利方向&#xff0c;我把这部分内容单独摘出来再整理一下。现在的生成式 AI 大家应该不陌生&#xff0c;用它总结文章、翻译、写作、画图&#xff0c;当然真正…

搭建私有Git服务器:GitLab部署详解

引言&#xff1a; 为了方便团队协作和代码管理&#xff0c;许多组织选择搭建自己的私有Git服务器。GitLab是一个集成了Git版本控制、项目管理、代码审查等功能的开源平台&#xff0c;是搭建私有Git服务器的理想选择。 目录 引言&#xff1a; 一、准备工作 在开始部署GitLab之…

MySQL数据库基础(十五):PyMySQL使用介绍

文章目录 PyMySQL使用介绍 一、为什么要学习PyMySQL 二、安装PyMySQL模块 三、PyMySQL的使用 1、导入 pymysql 包 2、创建连接对象 3、获取游标对象 4、pymysql完成数据的查询操作 5、pymysql完成对数据的增删改 PyMySQL使用介绍 提前安装MySQL数据库&#xff08;可以…

shell脚本介绍及基本功能

目录 1. 什么是shell 2. hello word 2.1 echo 2.2 第一个脚本 3. Bash的基本功能 3.1别名 3.2 常用快捷键 3.3 输入输出 3.4 输出重定向 3.5 多命令执行 3.6 管道符 3.7 通配符和特殊符号 1. 什么是shell Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用…

STM32--低功耗模式详解

一、PWR简介 正常模式与睡眠模式耗电是mA级&#xff0c;停机模式与待机模式是uA级。 二、电源框图 供电区域有三处&#xff0c;分别是模拟部分供电&#xff08;VDDA&#xff09;&#xff0c;数字部分供电&#xff0c;包括VDD供电区域和1.8V供电区域&#xff0c;后备供电&…

mysql和redis双写一致性策略分析

mysql和redis双写一致性策略分析 一.什么是双写一致性 当我们更新了mysql中的数据后也可以同时保证redis中的数据同步更新&#xff1b; 数据读取的流程&#xff1a; 1.读取redis,如果value!null,直接返回&#xff1b; 2.如果redis中valuenull&#xff0c;读取mysql中数据对应的…

Leaflet-学习

一、官网 英文官网&#xff1a;Leaflet 中文官网&#xff1a;Leaflet 二、介绍 Leaflet 是一个开源并且对移动端友好的交互式地图 JavaScript 库。 它大小仅仅只有39 KB, 并且拥有绝大部分开发者所需要的所有地图特性。 Leaflet 简单、高效并且易用。 它可以高效的运行在桌…

uni-app原生api的promise化以解决异步等待问题分析

相信各位在进行uni-app开发的时候会遇到各种关于异步回调问题&#xff0c;例如要传code给后端以换取session_key&#xff0c;在这之前需要先调用 uni.login&#xff0c;所以执行的顺序是必须同步等待的。在写这篇文章之前对于整体的流程概念需要做一个梳理&#xff0c;以便能更…

SSMBUG之 url +

1. Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured. 经查, 书写一切正常. 注意到此时yml文件的图标是一个红色的Y而不是绿色的spring , 推测没有正确加载. 重新创建项目, 所有东西拷贝一份便恢复正常…

猫头虎分享已解决Bug || AttributeError: ‘Sequential‘ object has no attribute ‘session‘

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

MySQL报错:sql_mode=only_full_group_by解决方法

Linux环境 ubuntu 22.04 MySQL是8.0.35版本 问题描述 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column auth_system.t_class_temp_config.id which is not functionally dependent on columns in GROUP BY clause; this is inco…

Delphi之后的接班人?国产可视化编程工具重塑经典

Delphi&#xff0c;这个名字对于许多80后的程序员来说&#xff0c;无疑是一种深深的情怀。它曾是可视化编程的王者&#xff0c;承载着无数开发者的青春记忆。 在Pascal语言盛行的年代&#xff0c;Delphi以其独特的魅力&#xff0c;迅速在编程界崭露头角。当时流传着这样一句话&…

Java实现公司货物订单管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 客户管理模块2.2 商品维护模块2.3 供应商管理模块2.4 订单管理模块 三、系统展示四、核心代码4.1 查询供应商信息4.2 新增商品信息4.3 查询客户信息4.4 新增订单信息4.5 添加跟进子订单 五、免责说明 一、摘要 1.1 项目…

开启数字内容创作的新时代

目录 技术解析 未来展望 技术解析 Sora是一款由OpenAI开发的先进AI视频模型&#xff0c;其技术架构基于深度学习和自然语言处理技术。该模型的核心算法原理包括使用深度神经网络进行视频内容的理解、生成和互动。 在技术架构方面&#xff0c;Sora采用了一种混合的神经网络结…

架构设计:流式处理与实时计算

引言 随着大数据技术的不断发展&#xff0c;流式处理和实时计算在各行各业中变得越来越重要。那么什么是流式处理呢&#xff1f;我们又该怎么使用它&#xff1f;流式处理允许我们对数据流进行实时分析和处理&#xff0c;而实时计算则使我们能够以低延迟和高吞吐量处理数据。本…

【MySQL高可用集群】MySQL的MGR搭建

前情提要&#xff1a; MySQL官方在 5.7.17版本正式推出组复制&#xff08;MySQL Group Replication&#xff0c;简称MGR&#xff09;&#xff0c;使用类似 zookeeper 的多于一半原则。在一个集群由 2N1 个节点共同组成一个复制组&#xff0c;一个事务的提交&#xff0c;必须经过…

蛋白结构预测模型评价指标

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 文章目录 前言一、蛋白结构预测模型评价指标TM-scorelDDT 二、Alphafold中的评价指标pLDDTpTMPAE 三、AlphaFold-multimer 蛋白结构的评价指标DockQipTM 总结参考资料 前言 本文汇总了AlphaFold和AlphaFold-mul…

tigramite教程(二)生物地球科学案例研究

文章目录 数据生成与绘图因果发现分析平稳性假设、确定性、潜在混杂因素结构假设参数假设使用PCMCIplus的滑动窗口分析聚合因果图非参数因果效应估计假设的图形和调整集干预的真实情况假设的参数模型和因果效应的估计使用关于图的不同假设进行估计非因果估计项目地址 这个文件…

LeetCode_Java_动态规划(2)(题目+思路+代码)

131.分割回文串 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1&#xff1a; 输入&#xff1a;s "aab" 输出&#xff1a;[["a&qu…