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

差分数组前缀和优化,降低时间复杂度

码蹄集OJ-激光控制器

#include<bits/stdc++.h> 
using namespace std;
int main( )
{int N;cin>>N;map<long,long>diff;long long pos=0;while(N--){int x;char c;cin>>x>>c;int l,r;if(c=='R'){l=pos;r=pos+x-1;pos=r;}if(c=='L'){l=pos-x+1;r=pos;pos=l;}diff[l]++;diff[r+1]--;}long long result=0;long long cur=0;long long le=LLONG_MIN;for(auto[co,d]:diff){if(le!=LLONG_MIN){ long long len=co-le;if(cur%4==1){result+=len;}}cur+=d;le=co;}cout<<result<<endl;return 0;
}

在一段范围内变化的题,可以采用暴力方法解决,但结果会超时。可以使用差分数组进行统计,最后统计结果。

定义一个diff差分数组,对于一段范围的左右边界,对左边界的差分数组加一,表示这个位置及后面的位置的值都加一,对右边界加一的差分数组减一,表示这个位置后的值都减一。这种办法和依次给每一个数组元素赋值是一样的,但这种方法节省了时间。

定义pos存储当前位置,初始时在原点。根据每一次操作找到左右边界,按上述方法存入差分数组中。

差分数组的统计:由于这道题的数据量大,采用map统计边界值,节省时间,而且map会从小到大排序。遍历这个差分数组,map中的数代表边界点,要从左向右整理每一个边界。每一个范围的变化数是相同的,所以统计这个范围的长度,如果符合题意,结果就是累加这个范围长度。

注意:要想知道每一个点变化了多少,就是累加map中的值的数,由于范围内的值等于零,所以范围内的变化数是相同的。

http://www.dtcms.com/a/306872.html

相关文章:

  • vue+elementui+vueCropper裁剪上传图片背景颜色为黑色解决方案
  • ‌我的第一个开源项目:跃动的心
  • 物流分拣漏检率↓78%!陌讯动态光流算法在包裹移动识别的技术突破
  • GCC链接技术深度解析:性能与空间优化
  • [mcp: McpSchema]-源码分析
  • 第1课:向量与矩阵运算
  • 搭建实时足球比分系统从零到一的实战指南
  • Day 4-1: 机器学习算法全面总结
  • 全新AI工具小程序源码 全开源(源码下载)
  • 深入浅出:在 Spring Boot 中构建实时应用 - 全面掌握 WebSocket
  • 解决 Docker 报错 “exec: no such file or directory”
  • 文件权限值的表示方法
  • PHP/Java/Python实现:如何有效防止恶意文件上传
  • Go 语言make函数
  • 输电线路绝缘子泄漏电流在线监测装置的技术解析与应用价值
  • Python读取获取波形图波谷/波峰
  • Directory Opus 使用优化
  • 30道JS高频经典笔试题集合+详解(一)
  • 视觉系统引导冲床冲压:工业自动化的“智能之眼”
  • Dify 从入门到精通(第 4/100 篇):快速上手 Dify 云端:5 分钟创建第一个应用
  • AI培训项目《人工智能大模型应用工程师》课程学习大纲分享!
  • 【sklearn(01)】数据集加载、划分,csv文件创建,特征工程,无量纲化
  • 【编号65】广西地理基础数据(道路、水系、四级行政边界、地级城市、DEM等)
  • 我的世界模组开发教程——资源(1)
  • JeecgBoot(1):前后台环境搭建
  • C#_创建自己的MyList列表
  • 汽车电子控制系统开发的整体安全理念
  • SOA增益谱与ASE光谱的区别
  • SSRF漏洞基础
  • RESTful API和WebSocket的优缺点,各自适合以及不适合什么样的场景