Peter算法小课堂—差分数组

我们先看一道例题:

太戈编程第1590题

1590. 修正带2

题目描述

小明写作文时,每次写错一句就马上会用修正带涂一次错误的地方。已知他作业最终共写了n个字,写作过程中错了m次,第i次错误是从第a[i]个字错到第b[i]个字,于是他将这些字涂上一层修正带。小明的错误罄竹难书,写着写着他发现有些地方的修正带变得越来越厚,小明想知道最厚的地方有几层修正带?

暴力模拟法

假设s[i]代表j号字被涂了几层

for(int i=1;i<=m;i++){
	cin>>a>>b;
	for(int j=a;j<=b;j++) s[j]++;
}

时间复杂度:O(nm)    我们可以换一种方法去进行一个优化,这个方法叫做传说中的“差分数组”

差分数组法

给定原数组s[],对应差分数组d[]

d[i]=s[i]-s[i-1],i=1,2,3,...,n

s[i]代表i号被涂几层   d[i]代表i号比i-1号多涂了几层

for(int i=1;i<=m;i++){
	cin>>a>>b;
	d[a]++;
	d[b+1]--;
}
for(int i=1;i<=n;i++)
	s[i]=s[i-1]+d[i];
cout<<*max_element(s+1,s+1+n)<<endl;

AC代码

#include <bits/stdc++.h>
using namespace std;
int n,m,d[200001],s[200001];
int main(){
    freopen("tape.in","r",stdin);
    freopen("tape.out","w",stdout);
    cin>>n>>m;
	for(int i=0;i<m;i++){
		int a,b;
		cin>>a>>b;
		d[a]++;
		d[b+1]--;
	}
	for(int i=0;i<n;i++)
		s[i]=s[i-1]+d[i];
	cout<<*max_element(s+1,s+1+n)<<endl;
	return 0;
}

相关推荐

  1. Peter算法课堂分数

    2023-12-11 11:24:02       36 阅读
  2. Peter算法课堂—树的应用

    2023-12-11 11:24:02       40 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-11 11:24:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-11 11:24:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-11 11:24:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-11 11:24:02       18 阅读

热门阅读

  1. 使用python统计字符串中字母个数的函数程序设计

    2023-12-11 11:24:02       46 阅读
  2. 7.1 C++11指针空值—nullptr

    2023-12-11 11:24:02       31 阅读
  3. synchronized和volatile的区别

    2023-12-11 11:24:02       31 阅读
  4. 基于AidLux的工业视觉少样本缺陷检测实战

    2023-12-11 11:24:02       41 阅读
  5. iOS 防截屏方法(一)

    2023-12-11 11:24:02       41 阅读
  6. React学习笔记

    2023-12-11 11:24:02       36 阅读
  7. 线程组、线程切换、线程异常

    2023-12-11 11:24:02       44 阅读
  8. scheduleatfixedrate详解

    2023-12-11 11:24:02       39 阅读
  9. Presto集群安装部署

    2023-12-11 11:24:02       44 阅读