ACWING/4262. 空调

本文介绍了一种利用差分数组解决区间更新问题的方法,并通过一个具体的编程实例演示了如何运用差分技巧来减少操作次数,使两个温度数组的差值数组变为全0数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

在这里插入图片描述

数据范围
1≤N≤10^5,
0≤p_i,t_i≤10000
输入样例:
5
1 5 3 3 4
1 2 2 2 1
输出样例:
5
样例解释
一组最优的 Farmer John 可以使用的指令如下:

初始温度     :1 2 2 2 1
升高牛棚 2..5:1 3 3 3 2
升高牛棚 2..5:1 4 4 4 3
升高牛棚 2..5:1 5 5 5 4
降低牛棚 3..4:1 5 4 4 4
降低牛棚 3..4:1 5 3 3 4

题解

差分

差分:对于数列 a,其第 i 个元素和第 i - 1 个元素的差称为数列 a 第 i 项的差分

有差分数组为 b,则存在:b[i] = a[i] - a[i - 1]

推导差分数组:
  • 预处理:b[i] = a[i] - a[i - 1]
  • 对差分数组求前缀和可以得到原数列 asumb[i] = b[1] + b[2] + ... b[i] = a[1] + a[2] - a[1] + ... + a[i] - a[i - 1] = a[i]
技巧:
  • O(1)时间复杂度对数组 a[l…r] 的每一个元素加上 p:差分数组操作d[l] += p, d[r+1] -= p, 则对差分数组复原a数组时候就可以得到区间内都加p

题目思路

题意可以转化为:将两个温度数组求差得到arr数组,求对区间加一或者减一的最少操作次数得到全0的数组

  • 区间加减法很容易就联系到差分数组

拟求得arr数组全0,则其差分数组也一定全0 :原因为,差分数组的实质为相邻两个数的差值,由于第一个数实际是和0做差分,则可以理解为差分数组全0 == 原数组第一个数与0的差值为0 == 原数组全为0

因此,我们每次可以从 差分数组b 中同时挑一个正数减 1,和一个负数加 1。也可以只挑一个正数减 1,或一个负数加 1

  • 挑一个正数减 1,和一个负数加 1:相当于对arr数组一个区间加减1
  • 只挑一个正数减 1,或一个负数加 1: 相当于对arr数组从某个位置及其后所有元素加减1

按照如此的操作方案,使得差分数组归0的操作次数为max(正数和,|负数和|)

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>

using namespace std;

int main(){
	int n;
	cin>>n;
	int arr[n+1];
	memset(arr, 0, sizeof arr);
	for(int i = 1; i <= n; i++){
		cin>>arr[i];
	}
	// 获得每个牛栏位置的空调调整度数
	for(int i = 1; i <= n; i++){
		int b;
		cin>>b;
		arr[i] -= b;
	}
	// 完成差分,从后向前遍历获取差分
	for(int i = n; i; i--){
		arr[i] -= arr[i-1];
	}
	// 要使得空调度数arr数组全0,则差分数组也应当全为0
	// 使得差分中正数位置减一,负数位置加一,则是完成一个区间[l,r]整体的减一
	// 还可以对某一个位置直接加一、减一,相当于对从该位置开始往后的所有值都加减一
	// 则要使得差分数组全变为0的次数是max(正数和,|负数和|)
	int pos = 0, neg = 0;
	for(int i = 1; i <= n; i++){
		if(arr[i] > 0) pos += arr[i];
		else neg -= arr[i]; // 用减法转化为绝对值后结果
	}
	cout << max(pos,neg) << endl; 
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlwaysDayOne

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值