当前位置: 首页 > news >正文

【蓝桥杯集训·每日一题】Acwing 3729. 改变数组元素

文章目录

  • 一、题目
    • 1、原题链接
    • 2、题目描述
  • 二、解题报告
    • 1、思路分析
    • 2、时间复杂度
    • 3、代码详解
  • 三、知识风暴
  • 一维差分
  • 区间合并

一、题目

1、原题链接

3729. 改变数组元素

2、题目描述

给定一个空数组 V 和一个整数数组 a1,a2,…,an

现在要对数组 V 进行 n 次操作。

第 i 次操作的具体流程如下:

从数组 V 尾部插入整数 0。 将位于数组 V 末尾的ai个元素都变为 1(已经是 1 的不予理会)。
注意:

  • ai 可能为 0,即不做任何改变。
  • ai 可能大于目前数组 V 所包含的元素个数,此时视为将数组内所有元素变为 1。

请你输出所有操作完成后的数组 V。

输入格式

第一行包含整数 T,表示共有 T 组测试数据。

每组数据第一行包含整数 n。

第二行包含 n 个整数 a1,a2,…,an。

输出格式

每组数据输出一行结果,表示所有操作完成后的数组 V,数组内元素之间用空格隔开。

数据范围

1≤T≤20000,1≤n≤2×105,0≤ai≤n,保证一个测试点内所有 n 的和不超过 2×105

输入样例

3
6
0 3 0 0 1 3
10
0 0 0 1 0 5 0 0 0 2
3
0 0 0

输出样例

1 1 0 1 1 1
0 1 1 1 1 1 0 0 1 1
0 0 0

二、解题报告

1、思路分析

思路1差分+区间合并
(1)将每个需要+1的区间合并,得到若干个不重叠的区间。
(2)对每个区间利用差分将每个区间元素值+1
(3)对差分数组求前缀和得到结果数组,输出即可。
思路2:y总思路

思路来源:y总每日一题b站视频链接
y总yyds

(1)直接对每个区间进行差分将每个区间元素值+1
(2)对差分数组求前缀和得到数组,如果数组元素值>=1说明进行了+1操作,直接输出1;否则说明该值没有+1,直接输出0

2、时间复杂度

思路1时间复杂度O(nlogn)(sort()函数、快排时间复杂度nlogn级别)
思路2时间复杂度O(n)

3、代码详解

思路1代码

#include <iostream>
#include <algorithm>
#include <utility>
#include <vector>
#include <cstring>
using namespace std;
typedef pair<int,int> PII;
vector<PII> v;
const int N=200010;
int pos;
int t,n;
int a[N],b[N];
//区间合并
void merge(vector<PII> &vec){vector<PII> ans;sort(vec.begin(),vec.end());int st=-1,ed=-1;for(auto i:vec){if(ed<i.first){if(st!=-1) ans.push_back({st,ed});st=i.first,ed=i.second;}else ed=max(ed,i.second);    }if(st!=-1) ans.push_back({st,ed});vec=ans;
}
//差分
void insert(int l,int r,int c){b[l]+=c;b[r+1]-=c;
}
int main(){cin>>t;while(t--){cin>>n;for(int i=1;i<=n;i++){pos=i;       //pos记录当前数组中元素的个数cin>>a[i];if(a[i]==0) continue;    //如果需要将0个元素置为1,跳过下面步骤,执行下一次循环if(pos<=a[i]){           //如果需要置为1的元素个数超过数组元素个数v.push_back({1,pos});        //需置成1的区间为整个数组}else{v.push_back({pos-a[i]+1,pos});   //否则需置成1的区间为数组后a[i]个元素所在区间}}merge(v);for(auto i:v){insert(i.first,i.second,1);}//差分数组求前缀和,得到结果数组for(int i=1;i<=pos;i++){b[i]+=b[i-1];cout<<b[i]<<' ';}cout<<endl;memset(b,0,sizeof b);     //注意不要忘记,下一次循环前需将元素置为0pos=0;                    //pos也别忘记v.clear();                //区间数组也得清空} return 0;
}

思路2代码

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=200010;
int t,n;
int a[N],b[N];
//差分
void insert(int l,int r,int c){b[l]+=c;b[r+1]-=c;
}
int main(){cin>>t;int pos=0;while(t--){cin>>n;for(int i=1;i<=n;i++){pos=i;                 //pos代表当前元素个数cin>>a[i];if(a[i]==0) continue;    //如果需要把0个元素置为1,直接跳过下面步骤,执行下一次循环if(a[i]>=pos){           //如果需要置的元素个数大于等于区间元素数insert(1,pos,1);     //将[1,pos]即整个区间加1}else{insert(pos-a[i]+1,pos,1);  //否则只个数组后a[i]个元素加1}}//差分数组求前缀和,得到每个区间加1后的结果数组for(int i=1;i<=pos;i++){b[i]+=b[i-1];if(b[i]>=1) cout<<1<<' ';     //如果某个位置加了大于等于1次个1,输出1else cout<<0<<' ';            //如果没有加过1,输出0}cout<<endl;memset(b,0,sizeof b);    //注意不要忘记,下一次循环前需将元素置为0pos=0;                   //pos也别忘记}return 0;
}

三、知识风暴

一维差分

  • 一维差分可以快速地给指定区间的每个数加任意常数c
  • 差分数组顾名思义就是相邻元素之差组成的数组。
  • 我们如果要对某个区间加减任意常数c可以先求其差分数组,然后对差分数组进行操作。设b数组为差分数组。
    操作:对[l,r]区间每个数+cb[l]+=c,b[r+1]-=c
    最后再对差分数组求前缀和即为处理后的原数组。

区间合并

  • 区间合并就是将某些有重叠(或者说是相交)的区间合并。
  • 基本思路:
    1. 将所有需要合并的区间按左端点排好序。
    2. 以排好序的第一个区间开始,看第二个区间是否与第一个区间有重叠,而且右端点比第一个区间大,如果满足则合并,合并操作就是将第一个区间的右端点更新成第二个区间的右端点;如果第二个区间被第一个区间所完全覆盖,则合并后的区间就是第一个区间,不需要操作;如果第二个区间和第一个区间完全没有交集,说明第二个区间的左端点比第一个区间的右端点大,而我们又是按照区间左端点进行排序的,则下一个区间的左端点也比第一个区间的左端点大,说明当前第一个区间已经和后面所有区间都不可能有交集了,所以第一个区间已经合并完成,我们将其放入结果数组中,下一次将剩下区间里的第一个区间进行如上合并操作,直到完成所有区间合并操作,将最后一个区间也放入结果数组,合并完成。

相关文章:

【蓝桥杯集训·每日一题】Acwing 3729. 改变数组元素

文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴一维差分区间合并一、题目 1、原题链接 3729. 改变数组元素 2、题目描述 给定一个空数组 V 和一个整数数组 a1,a2,…,an。 现在要对数组 V 进行 n 次操作。 第 i 次操作的…...

springmvc执行流程

文章目录前言一、springMVC请求执行流程二、组件说明以下组件通常使用框架提供实现&#xff1a;总结前言 本篇文章是对springmvc的补充 接上篇文章springmvc入门https://blog.csdn.net/l_zl2021/article/details/127120873 一、springMVC请求执行流程 1.用户发送请求至前端控制…...

SpringMVC(2)

一)接受到JSON格式的数据:使用RequestBody来进行接收 ResponseBody表示的是返回一个非页面的数据 RequestBody表示的是后端要接受JSON格式的数据 一)接收单个格式的JSON格式的数据&#xff0c;我们使用一个对象来进行接收 1)我们之前接受GET请求中的queryString中的参数的时候&…...

Jackson序列化json时null转成空串或空对象

在项目中可能会遇到需要将null转""&#xff0c;可以通过以下方法解决。一&#xff1a;添加JacksonConfig 配置import com.fasterxml.jackson.core.JsonGenerator;import com.fasterxml.jackson.databind.JsonSerializer;import com.fasterxml.jackson.databind.Objec…...

如何将Python的上级目录的文件导入?【from.import】

假如有如下目录&#xff1a; -python ----file1 ---------file1_1 ------------------pfile1_1.py ---------pfile1.py ----file2 ---------pfile2.py ----pfile.py ----data.py 在pfile1_1.py中想要将pfile.py 导入怎么办&#xff1f; 首先将其上级目录添加到系统目…...

Java实现碧蓝航线连续作战

目录一.实现功能二.主要思路三.代码实现四.用exe4j生成.exe程序五.最终效果六.代码开源一.实现功能 主线图作战结束到结算页自动点击再次前往 二.主要思路 判断是否进入了结算界面&#xff1a;记录结算界面某个像素点的RGB值&#xff0c;每隔3秒对这个像素点进行比对 移动鼠标…...

Docker笔记

文章目录1.docker为什么会出现2.docker是什么3.传统虚拟机和容器的对比3.1虚拟机3.2容器虚拟化技术3.3两者对比3.4为什么Docker会比VM虚拟机快&#xff1f;4.docker能干嘛6.docker的应用场景7.docker三要素一&#xff1a;镜像&#xff08;Image&#xff09;二&#xff1a;容器&…...

情人节使用AI TOOL来创建一个甜言蜜语的女伴

一、首先使用chatgpt生成一段情侣间的对话&#xff0c;需要反复几次&#xff0c;达到满意的程度&#xff0c;然后将女方的话归在一起。 这是一个情侣私下谈话的场景&#xff0c;女方表示对男朋友精心准备的情人节安排和礼物表示很满意 二、 打开网站&#xff1a;https://lexic…...

G-GhostNet(IJCV 2022)原理与代码解析

paper&#xff1a;GhostNets on Heterogeneous Devices via Cheap Operationscode&#xff1a;https://github.com/huawei-noah/Efficient-AI-Backbones/blob/master/g_ghost_pytorch/g_ghost_regnet.py前言本文提出了两种轻量网路&#xff0c;用于CPU端的C-GhostNet和用于GPU端…...

Ethercat系列(5)TWcat3激活过程的协议分析(续1)

顺序写系统时间偏移从-》主顺序写时间延迟主-》从从-》主顺序写分布式时钟启动主-》从从-》主读多重写系统时间主-》从从-》主顺序写应用层控制主-》从从-》主顺序读错误计数器主-》从从-》主顺序读应用层状态主-》从从-》主顺序读应用层&#xff0c;广播写错误计数器主-》从从…...

QT入门Input Widgets之QScrollBar

目录 一、界面布局功能 1、界面位置介绍 2、控件界面基本属性 2.1 horizontalScrollBar界面属性 3、样式设置 此文为作者原创&#xff0c;创作不易&#xff0c;转载请标明出处&#xff01; 一、界面布局功能 1、界面位置介绍 QScrollBar主要分为两种&#xff0c;一种垂直…...

【ML】基于机器学习的心脏病预测研究(附代码和数据集,多层感知机模型)

写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大努力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 之前创作过心脏病预测研究文章如下: 【ML】基于机器学习的心脏病预测研究(附代码和数据集,逻辑回归模型) 【ML】基于机…...

工序排序问题--约翰逊法精讲

什么是约翰逊法?约翰逊法是作业排序中的一种排序方法。选出最短加工时间i*&#xff0c;若最短加工时间有多个&#xff0c;任选1个.若i*出现在机床1&#xff0c;它对应的工件先安排加工&#xff0c;否则放在最后安排&#xff0c;安排后划去该工件,重复上两个步骤&#xff0c;直…...

WebDAV之葫芦儿·派盘+网盘精灵

网盘精灵 支持WebDAV方式连接葫芦儿派盘。 推荐一款让您的iPhone、iPod、iPad 变成WebDav客户端的软件,支持从WebDav服务器连接葫芦儿派盘服务进行上传和下载件。 网盘精灵让您的iPhone、iPod、iPad 变成WebDav客户端。功能:WebDav操作、文件共享、本地文件管理...

计算机网络期末知识点总结

计算机网络期末知识点总结第四章—网络层&#xff1a;数据面4.1概述4.2虚电路和数据报网络4.3路由器工作原理4.4网际协议&#xff1a;因特网中的转发和编址第五章 网络层&#xff1a;控制面5.1路由选择算法5.2路由器中的路由选择5.3广播和多播路由选择第六章 链路层&#xff08…...

【Vue3 组件封装】vue3 轮播图组件封装

文章目录轮播图功能-获取数据轮播图-通用轮播图组件轮播图-数据渲染轮播图-逻辑封装轮播图功能-获取数据 目标: 基于pinia获取轮播图数据 核心代码&#xff1a; &#xff08;1&#xff09;在types/data.d.ts文件中定义轮播图数据的类型声明 // 所有接口的通用类型 export typ…...

电力国家(行业)标准目录

1、3&#xff5e;63kV交流高压负荷开关 GB 3804-90 代替 GB 3804-882、电气装置安装工程35kV及以下架空电力线路施工及验收规范Code for construction and acceptance of 35kVand umder over head power levels electricequipment installation engineeringGB50173—923、带电作…...

如何实现倒序输出

问题 如何实现字符串的大小写转换并倒序输出。 方法 采用Java自带的类方法进行倒序。 package homework4; public class Blog09 { public static void main(String[] args) { String a "HelloWord"; String a2 a.toUpperCase(); String a3 …...

遗留系统的自动化测试策略和实践方法

1 什么是遗留系统 遗留系统是一种旧的方法、旧的技术、旧的计算机系统或应用程序,属于或与以前的、过时的计算机系统有关,但仍在使用中。通常,将系统称为“遗留系统”意味着它可能已经过时或需要更换,但是系统还在对外提供服务,还在不断的迭代,有新的需求不断的交付。Ma…...

【Android】系统源码下载及编译

源码及编译 步骤 1&#xff1a;创建一个空目录来存放源码&#xff1a; mkdir aosp cd aosp步骤 2&#xff1a;获取最新版本的 repo 并签出 android-8.1.0_r1 分支&#xff1a; repo init -u https://android.googlesource.com/platform/manifest -b android-8.1.0_r1其中&am…...

基于HTML实现浪漫情人节表白代码(附源代码)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

PCL 平面拟合——RANSAC

文章目录 一、基本思想二、代码示例1、参数选择2、核心代码3、完整代码4、结果展示三、关于 RANSAC 的一些思考参考文献一、基本思想 随机抽样一致性算法RANSAC(Random sample consensus)是一种迭代的方法,从一系列包含有离群值的数据中计算数学模型参数的方法。RANSAC算法本…...

【Linux之Shell脚本实战】监控系统的磁盘空间使用率

【Linux之Shell脚本实战】监控系统的磁盘空间使用率 一、脚本要求二、检查本地系统环境1.检查系统版本2.检查系统内核版本三、编写disk.sh脚本1.创建脚本目录2.编写disk.sh脚本3.执行测试脚本四、查看脚本执行日志文件五、本次实践总结1.脚本定时执行2.实践总结一、脚本要求 1.…...

【Python安全编程】Python实现网络主机和端口扫描

文章目录前言环境准备Python实现主机扫描基于ARP协议基于ICMP协议普通版本多线程版本Python实现端口扫描扫描单个端口利用多线程扫描端口后记前言 本文主要讲几个利用Python实现网络扫描的小例子&#xff0c;可以结合多线程或多进程编程改进实例 我曾经走过多遥远的路 跨越过多…...

四大垃圾回收算法七大垃圾回收器

JVM的运行时内存也叫做JVM堆&#xff0c;从GC的角度可以将JVM分为新生代、老年代和永久代。其中新生代默认占1/3堆内存空间&#xff0c;老年代默认占2/3堆内存空间&#xff0c;永久代占非常少的对内存空间。新生代又分为Eden区、SurvivorFrom区和SurvivorTo区&#xff0c; Eden…...

P1217 [USACO1.5]回文质数 Prime Palindromes

[USACO1.5]回文质数 Prime Palindromes 题目描述 因为 151151151 既是一个质数又是一个回文数&#xff08;从左到右和从右到左是看一样的&#xff09;&#xff0c;所以 151151151 是回文质数。 写一个程序来找出范围 [a,b](5≤a<b≤100,000,000)[a,b] (5 \le a < b \l…...

用大白话给你科普,到底什么是 API(应用程序编程接口)?

何为API&#xff1f;如果你在百度百科上搜索&#xff0c;你会得到如下结果&#xff1a;API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件得以访问一组…...

企业电子招采系统源码——信息数智化招采系统

​ 信息数智化招采系统 服务框架&#xff1a;Spring Cloud、Spring Boot2、Mybatis、OAuth2、Security 前端架构&#xff1a;VUE、Uniapp、Layui、Bootstrap、H5、CSS3 涉及技术&#xff1a;Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monitor、…...

【vnc】Ubuntu20.04+vnc安装和配置(中文输入法)

Ubuntu20.04vnc安装和配置(中文输入法) 安装vnc 用以下apt 命令安装&#xff1a; sudo apt install tigervnc-common tigervnc-standalone-server tigervnc-viewer tigervnc-xorg-extension注意&#xff0c;要用standalone-server版本&#xff0c;不要下载Tiger官方安装包&a…...

【排序算法】数据结构排序详解

前言&#xff1a; 今天我们将讲解我们数据结构初阶的最后一部分知识的学习&#xff0c;也是最为“炸裂”的知识---------排序算法的讲解&#xff01;&#xff01;&#xff01;&#xff01; 目录1.排序的概念及其运用1.1排序的概念1.2排序运用2.常见排序算法的实现2.1 插入排序2…...

中山市区做网站公司/亚马逊的免费网站

导读&#xff1a;高考专业解读&#xff0c;计算机科学与技术国家重点学科&#xff0c;21所高校获评&#xff01;计算机科学与技术专业一直以来都是报考的热门&#xff0c;计算机科学与技术(0821)下设3个二级学科081201计算机系统结构&#xff1b;081202计算机软件与理论&#x…...

11网拍推广平台/seo诊断站长

2019独角兽企业重金招聘Python工程师标准>>> 1、firewalld的基本使用 启动&#xff1a; systemctl start firewalld 关闭&#xff1a; systemctl stop firewalld 查看状态&#xff1a; systemctl status firewalld 开机禁用 &#xff1a; systemctl disable firew…...

深圳坂田做网站/aso优化排名推广

今天在网上看到了一个开源库:Spruce Android Animation Library (and iOS) 也就是大家会说这个关Fragment的什么事&#xff0c;别急&#xff0c;听我慢慢来说。 我们来可以下载它的Demo文件&#xff1a; 上面Gif的图片里面的界面&#xff0c;是RecyclerActivity.java&#xff0…...

旅游网站建设服务对象/百度关键词排名代做

堡垒机Teleport在Linux平台的安装设置下载teleport的Linux版本安装包http://teleport.eomsoft.net/download/get-file/teleport-server-linux-x64-3.0.1.6.tar.gz将下载得到的安装包放到临时目录中&#xff0c;然后执行下列命令&#xff1a;tar -zxvf teleport-linux-x64-3.0.1…...

成都制作网站公司/seo网站优化工具大全

身份证中第十八位数字的计算方法为&#xff1a;1. 将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为&#xff1a;7. 9 .10 .5. 8. 4. 2. 1. 6. 3. 7. 9. 10. 5. 8. 4. 2.2. 将这17位数字和系数相乘的结果相加。3. 用加出来和除以11&#xff0c;看余…...

怎么做网站卖保险/域名信息查询

1.什么字符串会进入字符串常量池 1. 直接写的字面量 2. 字面量的拼接结果&#xff08;注意&#xff1a;如果字符串拼接中有变量则结果不会进入字符串常量池&#xff09; 3. 调用String的intern方法可以将String存入字符串常量池 2. 字面量的拼接原理 有如下列展示代码&…...