【CSP试题回顾】202109-2-非零段划分

CSP-202109-2-非零段划分

关键点:差分数组

详见:【CSP考点回顾】差分数组

时间复杂度分析

使用差分数组的优势在于,它将问题转化为了在一次遍历中识别并利用关键变化点(波峰和波谷),从而避免了对每个可能子数组的重复检查。这种方法利用了问题的特殊结构——即只有在特定的转折点才需要更新我们的计数——来大幅度减少必要的计算量。因此,在处理大数据量时,差分数组方法的效率远高于暴力枚举法。

  1. 暴力枚举法(70分)

    • 在暴力枚举方法中,尝试每个可能的子数组,然后检查每个子数组是否符合条件(是否是非零段)。对于每个长度为 n 的数组,有 n ( n + 1 ) / 2 n(n+1)/2 n(n+1)/2 种可能的子数组(因为我们可以从数组的每个位置开始,选择不同的结束位置)。
    • 对于每个子数组,我们需要 O ( m ) O(m) O(m) 的时间来验证它是否是一个非零段,其中 m 是子数组的长度。因此,总的时间复杂度将会是 O ( n 3 ) O(n^3) O(n3)(因为对于每个子数组我们都进行了线性时间的检查)。
  2. 差分数组法(100分)

    • 使用差分数组的方法,我们首先通过一次遍历( O ( n ) O(n) O(n) 时间复杂度)处理原数组来建立差分数组,并进行初始化处理(例如,标记波峰和波谷)。
    • 接下来,我们再次遍历差分数组(又是 O ( n ) O(n) O(n) 时间复杂度)来计算最长的非零段。在这次遍历中,我们累积差分值,并记录最大的累积值。
    • 因此,整个过程的时间复杂度是 O ( n ) + O ( n ) = O ( n ) O(n) + O(n) = O(n) O(n)+O(n)=O(n),远低于暴力枚举方法的 O ( n 3 ) O(n^3) O(n3)

解题思路

  1. 使用向量 A,在其开始和结束位置添加额外的零元素,以符合问题中提到的非零段定义。
  2. 使用 unique 函数对数组 A 进行去重,即连续重复的元素只保留一个,因为连续的相同值不会影响非零段的长度
  3. 通过遍历数组 A,计算差分数组 diff在波峰位置加一,在波谷位置减一。这里波峰指的是 A[i] 比它前后的元素都要大的情况,波谷指的是 A[i] 比它前后的元素都要小的情况(详见下图)。

请添加图片描述

在这个问题中,使用“波峰”和“波谷”的概念来加一或减一,实际上是利用差分数组的特性来标记数组中的重要转变点。我们利用差分数组来记录特定模式的出现——即数组中的极值点。

  1. 为什么在波峰位置加一
    • 波峰定义为一个元素,其值大于其前后的元素(A[i-1] < A[i] > A[i+1])。在这个位置加一是为了标记一个上升段的结束和下降段的开始。这是非零段可能的开始或结束,因为在实际应用中,一个上升然后下降的序列(波峰)意味着我们找到了一个完整的子段,这可能是我们寻找的非零段的一部分
  2. 为什么在波谷位置减一
    • 波谷定义为一个元素,其值小于其前后的元素(A[i-1] > A[i] < A[i+1])。在这个位置减一是为了标记一个下降段的结束和上升段的开始。这也是非零段可能的开始或结束,因为它标志着一个低谷,即从高值下降到低值的转变点。

请添加图片描述

  1. 遍历差分数组 diff,累加当前值到 sum,并更新 noneZeroMax,用来记录遇到的最大的非零段长度。sum 的计算方式保证了我们只在非零段内进行计数,并且每次遇到非零段时都检查是否能更新最大长度。

完整代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int n, sum, noneZeroMax;
vector<int>diff(50000); // 差分数组int main() {cin >> n;vector<int>A(n + 2, 0); // A的第一个和最后一个元素置零(非零段定义)for (int i = 1; i <= n; i++){cin >> A[i];}auto last = unique(A.begin(), A.end()); // 去重A.erase(last, A.end());// 计算差分数组:波峰+1,波谷-1for (int i = 1; i <= A.size() - 2; i++){if (A[i - 1] < A[i] && A[i] > A[i + 1]) diff[A[i]]++;if (A[i - 1] > A[i] && A[i] < A[i + 1]) diff[A[i]]--;}// 统计最大非零段for (int i = diff.size()-1; i >= 0; i--){sum += diff[i];noneZeroMax = max(sum, noneZeroMax);}cout << noneZeroMax;return 0;
}

请添加图片描述

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

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

相关文章

Mysql中的MVCC

”真正学会&#xff0c;如你般自由~“ MVCC机制简介 MVCC(Multi-Version-Concurrency-Control)多版本并发控制&#xff0c;MVCC 是一种并发控制的方法&#xff0c;一般在数据库管理系统中&#xff0c;实现对数据库的并发访问&#xff1b;在编程中实现事务内存。 取自 MVCC存在被…

某准网招聘接口逆向之WebPack扣取

​​​​​逆向网址 aHR0cHM6Ly93d3cua2Fuemh1bi5jb20v 逆向链接 aHR0cHM6Ly93d3cua2Fuemh1bi5jb20vc2VhcmNoP3BhZ2VOdW09MSZxdWVyeT1weXRob24mdHlwZT01 逆向接口 aHR0cHM6Ly93d3cua2Fuemh1bi5jb20vYXBpX3RvL3NlYXJjaC9qb2IuanNvbg 逆向过程 请求方式&#xff1a;GET 参数构成…

Clickhouse表引擎介绍

作者&#xff1a;俊达 1 引擎分类 ClickHouse表引擎一共分为四个系列&#xff0c;分别是Log、MergeTree、Integration、Special。其中包含了两种特殊的表引擎Replicated、Distributed&#xff0c;功能上与其他表引擎正交&#xff0c;根据场景组合使用。 2 Log系列 Log系列…

k8s-生产级的k8s高可用(1) 24

高可用集群 实验至少需要三个master&#xff08;控制节点&#xff09;&#xff0c;一个可以使外部可以访问到master的load balancer&#xff08;负载均衡&#xff09;以及一个或多个外部节点worker&#xff08;也要部署高可用&#xff09;。 再克隆三台主机 清理并重启 配置两…

LayerNorm的图是不是画错了

这是网上一张很流行的说明几个 Normalization 区别的图 这图出自Kaiming的文章 Group Norm 但是他这个 Layer Norm 的图是不是画错了? 我大四写毕设的时候就想问&#x1f923;&#x1f923;&#x1f923; 这都几年过去了 我觉得图应该是这样画的&#xff0c;相同颜色的区域…

VSCode搭建ARM开发环境

为了构建Cortex M系列单片机免费开源的开发环境&#xff0c;网络上了解来看VSCODEGCCJLINK是一套比较高效的组合方式&#xff0c;下面记录环境搭建的流程。 我这边的PC环境为 WIN7专业版64bit。 需要用到的工具 Visual Studio CodeSTM32CubemxARM GCC 交叉编译工具链&#x…

cadence 之 Allegro PCB封装 3D模型

Allegro PCB封装怎样赋3D模型 1、方式一 —— 设置器件高度 2、方式二 —— 指定STEP模型 2.1、Step 3D模型库 2.2、软件环境的设置和 STEP 模型库路径设置 D:\Cadence\Cadence_SPB_17.4-2019\share\local\pcb\step 2.3、指定STEP模型 即可打开 STEP 模型指定的对话框&…

【理解】STM32一键下载电路

1.MCUISP 串口软件一键下载设置&#xff1a; DTR 低电平复位&#xff0c;RTS 高电平进入boot load 串口下载 在ch340 芯片对应DTR 和RTS 输出电平与电脑软件设置的电平相反。 一键下载电路根据ch340 芯片对应引脚的控制信号完成对应功能 具体实现过程如下&#xff1a; 2.单…

VR数字化线上展馆降低企业投入成本和周期

VR云展会是一种全新的展览形式&#xff0c;它利用虚拟现实技术&#xff0c;将实体展览搬到线上&#xff0c;让观众可以在家中就能参观各种展览。这种新型的展览方式有许多亮点&#xff0c;下面就来详细介绍一下。 首先&#xff0c;VR云展会打破了地域限制。传统的实体展览通常只…

WPF 消息提示 类似toast方式

WPF里面的消息提示一般都是MessageBox.Show()&#xff0c;这种样式不是很好看&#xff0c;所以就想办法重新搞了一个类似弹出消息的功能。原理很简单&#xff0c;就是弹出一个新窗体&#xff0c;然后等几秒窗体自动关闭。 先上效果图&#xff1a; 新建一个MsgHelper.cs类&…

海外互联网专线主要解决企业哪些办公问题?

海外互联网专线 是一种专门为跨境企业提供的网络连接服务&#xff0c;旨在解决企业在海外办公过程中遇到的各种网络问题。海外互联网专线如何成为解决企业办公难题的利器&#xff0c;为企业提供稳定、高速的网络连接? 1、跨国远程办公&#xff1a; 随着全球化进程的加速&…

Android应用界面

概述&#xff1a;由于学校原因&#xff0c;估计会考&#xff0c;曹某人就浅学一下。 目录 View概念 创建和使用布局文件 相对布局 线性布局 水平线性布局 垂直线性布局 表格布局 帧布局 扁平化布局 Android控件详解 AdapterView及其子类 View概念 安卓中的View是所…

Codesys.运动控制电子齿轮

文章目录 一. 电子齿轮概念应用 二. 电子齿轮耦合功能块 2.1. MC_GearIn 2.2. MC_GearInPos 2.3. MC_GearOut 三. 电子齿轮案例 3.1. 样例介绍 3.2. 引入虚轴 3.3. 程序框架 3.4. 程序编写 3.5. 程序监控 一. 电子齿轮概念应用 在很多应用场景中有多个牵引轴每个牵引…

【重温设计模式】备忘录模式及其Java示例

备忘录模式的概述 在软件设计的世界中&#xff0c;备忘录模式是一种行为设计模式&#xff0c;它的主要作用是保存对象的当前状态&#xff0c;以便在将来的某个时间点&#xff0c;可以将对象恢复到这个保存的状态。这种模式的命名源于生活中的备忘录&#xff0c;我们常常用它来…

俄罗斯方块h5源码

上传源码至服务器和空间即可使用&#xff0c;源码无后门&#xff0c;就一天html文件&#xff0c;一个两个css文件以及一个js文件 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88897605 更多资源下载&#xff1a;关注我。

148个Chatgpt关键词汇总-有爱AI实战教程(二)

演示站点&#xff1a; https://ai.uaai.cn 技能模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 导读&#xff1a;在使用 ChatGPT 时&#xff0c;当你给的指令越精确&#xff0c;它的回答会越到位&#xff0c;举例来说&#xff0c;假如你要请它帮忙写文案&#xff0c;如…

devops-Maven【部署及配置】

1、准备maven工具包&#xff0c;Maven官网下载Maven的安装包 Maven – Download Apache Maven Index of /maven (apache.org) 选择后缀是.bin.tar.gz的文件下载&#xff0c;此处下载的版本是3.9.6。 2、安装maven的目录下&#xff0c;建一个Maven路径&#xff0c;然后把压缩…

JAVA虚拟机实战篇之内存调优[5](诊断和解决问题-两种方式总结)

文章目录 版权声明诊断和解决问题 - 两种方案在线定位问题步骤在线定位问题 – btrace 总结内存溢出&内存泄漏内存溢出原因解决内存泄漏方法 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程序员或相关权…

探索数据可视化:Matplotlib 基础指南

图形绘制 import numpy as np import pandas as pd import matplotlib.pyplot as pltx np.linspace(0,2 * np.pi,100)# 说明&#xff1a;正弦波。x&#xff1a;NumPy数组 # 所有的数据&#xff0c;进行正弦计算 y np.sin(x)plt.plot(x,y)# 指定x轴范围 plt.xlim(-1,10) # 指…

746. 使用最小花费爬楼梯 (Swift版本)

题目 给你一个整数数组 cost&#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 限制条件 2…