【CSP】2021-09-2 非零段划分 索引+递推/差分+前缀和

2021-09-2 非零段划分 索引+递推/差分+前缀和

  • 2021-09-2 非零段划分 索引+递推/差分+前缀和
    • 索引+递推思路
    • 差分+前缀和思路
    • 遇到的问题
    • 索引+递推完整代码
    • 差分+前缀和完整代码

2021-09-2 非零段划分 索引+递推/差分+前缀和

一开始写的时候没有发现直接从a数组求q的规律,怎么也想不到怎么用差分前缀和,然后就是只使用了常规的思路建立索引,然后递推的求解,虽然也是过了,但是感觉不是最优解,于是上网搜了一下发现原来可以用这样用差分,以后能用差分就尽量用差分,毕竟差分是正解

索引+递推思路

这个方法是暴力的优化,如果是暴力的话,就是要遍历每一个p然后判断非零段的个数是多少,时间复杂度是 O ( n 2 ) O(n^2) O(n2) 这样肯定会超时,然后我们在此只之上,用一个map来存储每个值对应的下标,这样我们就不用每次遍历一次 O ( n ) O(n) O(n)而是复杂度 O ( l o g n ) O(log n) O(logn) 总的复杂度就是 O ( n l o g n ) O(nlogn) O(nlogn) ,然后就可以拿到100分了。

差分+前缀和思路

然后前面我们是遍历p,其实我们其实可以换个思路遍历a,求得p,这样我们可以实现复杂度是 O ( n ) O(n) O(n)了。

我们需要找到数组a和数组p的关系。首先p数组的含义我们很容易想到,就是p[i]就是p=i时非零段的个数,然后我们判断a[i]和a[i-1]来确定p

如果a[i-1]<a[i]

那么就是p[a[i]]到p[a[i-1]+1]这个区间内都增加一个非零段,所以这里用到了差分,p[a[i]+1]–,p[a[i-1]+1]++,实现O(1)的复杂度的区间操作。最后在求个前缀和算出所有p对应的非零段的个数,再求出最大值。总的时间复杂度就是O(n)

遇到的问题

  1. 递归初始状态的问题

用索引+递归的方法的话,我们得先计算初始的非零段有多少个,然后通过判断周围a[i-1]和a[i+1]的值,是否对非零段增加,并且注意要判断0和n-1的特殊情况。

然后就可以拿到100分

在这里插入图片描述

  1. 注意题目细节

如果使用前缀+差分的思路的话,得要注意啊题目说的,要是小于p的全部为0,而不是小于等于p的全部为零

对应的差分代码就要从

p[a[i]]--;
p[a[i-1]]++;

变成

p[a[i]+1]--;
p[a[i-1]+1]++;

然后这样就可以拿到100分了。

在这里插入图片描述

索引+递推完整代码

#include <bits/stdc++.h>
using namespace std;
int n;
int a[500001];
map<int, vector<int>> mp1; // value 对应的位置有哪些
int main()
{
    cin >> n;
    bool zero = true;
    int max_range = 0;
    int temp_num = 0;
    // 输入并且计算非零段的数目的初值
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
        if (a[i] != 0)
            mp1[a[i]].push_back(i);
        if (a[i] == 0)
            zero = true;
        if (a[i] != 0)
        {
            if (zero == true)
                temp_num++;
            zero = false;
        }
    }
    max_range = temp_num;
    for (auto item : mp1)
    {
        for (auto x : item.second)
        {
            if (x > 0 && x < n - 1)
            {
                if (a[x - 1] != 0 && a[x + 1] != 0)
                {
                    temp_num++;
                }
                else if (a[x - 1] == 0 && a[x + 1] == 0)
                {
                    temp_num--;
                }
            }
            if (x == 0 && a[x + 1] == 0)
            {
                temp_num--;
            }
            if (x == n - 1 && a[x - 1] == 0)
            {
                temp_num--;
            }
            a[x] = 0;
        }
        max_range = max(max_range, temp_num);
    }
    cout << max_range << endl;
    return 0;
}

差分+前缀和完整代码

#include <bits/stdc++.h>
using namespace std;
int n, a[500001], p[10001];
// 定义p[i]是不超过i的非零段的个数
// 那么p[i]-p[i-1]的含义是在i-1为0的基础上增加i为0后非零段的个数的增加
int main()
{
    cin >> n;
    int max_a = 0;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i]; // 输入数据
        max_a = max(max_a, a[i]);
    }
    for (int i = 1; i <= n; i++)
    {
        if (a[i] > a[i - 1])//如果前一个大于后一个
        {
            p[a[i - 1] + 1]++;
            p[a[i] + 1]--;
        }
    }
    int max_p = 0;
    for (int i = 1; i <= max_a + 1; i++)
    {
        p[i] += p[i - 1];
        max_p = max(max_p, p[i]);
    }
    cout << max_p;
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NCV8705MTADJTCG稳压器芯片中文资料规格书PDF数据手册引脚图图片价格功能

产品概述&#xff1a; NCV8705 是一款低噪音、低功耗和低泄漏线性电压稳压器。该器件具有卓越的噪音和 PSRR 规格&#xff0c;适用于使用视频接收器、成像传感器、音频处理器或需要外部洁净电源的任何部件的产品。NCV8705 使用创新的自适应接地电流电路 可确保轻负载调节下的超…

基于DFA敏感词查询的算法简析

基于DFA敏感词查询的算法简析 1.背景 项目中需要对敏感词做一个过滤&#xff0c;首先有几个方案可以选择&#xff1a; a.直接将敏感词组织成String后&#xff0c;利用indexOf方法来查询。 b.传统的敏感词入库后SQL查询。 c.利用Lucene建立分词索引来查询。 d.利用DFA算法…

3.python安装Selenium框架

1. 命令安装 pip install selenium下载慢,可以换源: pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/查看是否换源成功 pip config get global.index-url安装好后,查看版本信息: pip show selenium2.下载对应的浏览器驱动 https://registry.npmm…

【Elasticsearch】windows安装elasticsearch教程及遇到的坑

一、安装参考 1、安装参考&#xff1a;ES的安装使用(windows版) elasticsearch的下载地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch ik分词器的下载地址&#xff1a;https://github.com/medcl/elasticsearch-analysis-ik/releases kibana可视化工具下载…

Vue2 引入使用ElementUI详解

目录 1 安装2 引入2.1 全局引入2.1.1 引入2.1.2 使用 2.2 按需引入2.2.1 引入2.2.2 使用 3 总结 1 安装 推荐使用 npm 的方式安装&#xff0c;它能更好地和 webpack打包工具配合使用。&#xff08;本项目使用安装方式&#xff09; npm i element-ui -S也可以使用其他的包管理…

Notepad++从文件夹查找文本内容

目录 一、背景二、Notepad搜索2.1 测试用例2.2 操作说明 一、背景 在日常的办公、学习或编程中&#xff0c;我们时长会遇到需要在大量文件中搜索特定文本内容的情况&#xff1a; 无论是快速定位某个项目中的代码片段&#xff1b;还是检索文档资料库中的相关信息等。 掌握如何…

蓝桥杯:模拟、枚举

目录 引言一、修剪灌木二、特殊年份三、刷题统计 引言 本篇文章主要介绍蓝桥杯的模拟和枚举的题目&#xff0c;这种题在 B B B 组还是比较简单的&#xff0c;后续也会一直往里加新的真题&#xff0c;加油&#xff01; 一、修剪灌木 标签&#xff1a;第十三届蓝桥杯省赛C B组…

音乐创作利器FL Studio21水果软件助你轻松实现音乐创意

音乐创作利器——FL Studio21水果软件&#xff0c;让你的音乐梦想起航&#xff01; 副标题&#xff1a;一款强大的电脑数码编曲软件&#xff0c;助你轻松实现音乐创意&#xff01; 一、FL Studio21水果软件——音乐制作的得力助手** 在音乐创作的道路上&#xff0c;有一款得心…

uniapp样式穿透修改uview的按钮button图标

需求&#xff1a; 想给按钮icon和text改字体颜色&#xff0c;结果发现图标颜色并没有改变 .u-button{width: 300rpx;background-color: aliceblue;color: #aaaa7f;margin-top: 20rpx; }接下来用样式穿透解决 1、首先&#xff0c;给UI组件包裹一层view <view class"t…

Javaweb学习记录(一)Maven

Maven是一款Java项目管理工具&#xff0c;下面将介绍Maven的实际作用和相关的操作 Maven项目依赖的添加 在Maven项目中添加依赖&#xff0c;通过dependencies标签添加所有依赖&#xff0c;所有依赖都添加在里面&#xff0c;而单个依赖就使用dependency标签添加进项目&#xf…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑抽水蓄能电站参与容量交易辅助服务的双层优化策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

IntelliJ IDEA 2023.3.4创建JavaWeb应用和集成Tomcat服务器

1. 创建项目 如下图所示&#xff0c;只需要给项目起一个项目名称&#xff0c;然后点击Create即可&#xff1a; 2. Project Structure 设置 创建完成后如下图 3. 集成Tomcat服务器 4. 实现Servlet接口 当我们实现Servlet接口时&#xff0c;发现没有Servlet相关的依赖时&am…

碳素光线疗法与中医

看得见的穴位碳素光线疗法 最近日本的医疗随着科学技术的发达&#xff0c;在基础研究、临床各领域取得了显著的发展。日本人的平均寿命比战前大幅延长&#xff0c;结核及其他疑难杂症、癌症等疾病也在逐渐被压制。其中&#xff0c;作为癌症的辅助疗法&#xff0c;日本癌症学会等…

布隆过滤器原理介绍和典型应用案例

整理自己过去使用布隆过滤器的应用案例和理解 基本介绍 1970年由布隆提出的一种空间效率很高的概率型数据结构&#xff0c;它可以用于检索一个元素是否在一个集合中&#xff0c;由只存0或1的位数组和多个hash算法, 进行判断数据 【一定不存在或者可能存在的算法】 如果这些…

C#求水仙花数

目录 1.何谓水仙花数 2.求三位数的水仙花数 3.在遍历中使用Math.DivRem方法再求水仙花数 1.何谓水仙花数 水仙花数&#xff08;Narcissistic number&#xff09;是指一个 n 位正整数&#xff0c;它的每个位上的数字的 n 次幂之和等于它本身。例如&#xff0c;153 是一个 3 …

数据类型【mysql数据库】

一、数值类型 默认都是有符号&#xff0c;无符号要在对应的类型后跟unsigned 在语言上&#xff0c;可能会有截断&#xff0c;但mysql会对不合法的数据做拦截。所以&#xff0c;mysql中&#xff0c;数据类型本身也是一种约束&#xff08;约束使用者&#xff09;&#xff0c;保证…

后端系统开发之——创建SpringBoot工程

原文地址&#xff1a;后端框架系统开发之——创建SpringBoot工程 - Pleasure的博客 下面是正文内容&#xff1a; 前言 现在的市场环境&#xff0c;如果你单单只是作为前端工程师或者是后端工程师&#xff0c;在开发Web应用的时候都需要去读取企业提供的接口文档。而当你前后端…

编程开发语言工具之透明滑动标尺构件用法

编程开发语言工具之透明滑动标尺构件用法 一、前言 今天给大家分享的编程开发语言工具资料如下&#xff1a; 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载——常用工具下载——编程工具…

数据仓库数据分层详解

数据仓库中的数据分层是一种重要的数据组织方式&#xff0c;其目的是为了在管理数据时能够对数据有一个更加清晰的掌控。以下是数据仓库中的数据分层详解&#xff1a; 原始数据层&#xff08;Raw Data Layer&#xff09;&#xff1a;这是数仓中最底层的层级&#xff0c;用于存…

编译原理-实现识别无符号数的词法分析器——沐雨先生

实验任务&#xff1a; 实现识别无符号数的词法分析器 实验要求&#xff1a; 根据编译原理理论课教材中图2.4“无符号数的转换图”&#xff0c;用C语言编写识别无符号数的词法分析器&#xff0c;以文本文件为输入&#xff0c;控制台&#xff08;或文件&#xff09;输出识别出…