Acwing 4262.空调
Farmer John 的 N N N头奶牛对他们牛棚的室温非常挑剔。
有些奶牛喜欢温度低一些,而有些奶牛则喜欢温度高一些。
Farmer John 的牛棚包含一排 N N N 个牛栏,编号为 1 … N 1…N 1…N,每个牛栏里有一头牛。
第 i i i 头奶牛希望她的牛栏中的温度是 p i p_i pi,而现在她的牛栏中的温度是 t i t_i ti 。
为了确保每头奶牛都感到舒适,Farmer John 安装了一个新的空调系统。
该系统进行控制的方式非常有趣,他可以向系统发送命令,告诉它将一组连续的牛栏内的温度升高或降低
1
1
1 个单位——
例如 「将牛栏
5
…
8
5…8
5…8 的温度升高
1
1
1 个单位」。
一组连续的牛栏最短可以仅包含一个牛栏。
请帮助 Farmer John 求出他需要向新的空调系统发送的命令的最小数量,使得每头奶牛的牛栏都处于其中的奶牛的理想温度。
输入格式
输入的第一行包含
N
N
N。
下一行包含 N N N 个非负整数 p 1 … p N p_1…p_N p1…pN,用空格分隔。
最后一行包含 N N N个非负整数 t 1 … t N t_1…t_N t1…tN。
输出格式
输出一个整数,为 Farmer John 需要使用的最小指令数量。
数据范围
1
≤
N
≤
105
,
1≤N≤105,
1≤N≤105,
0
≤
p
i
,
t
i
≤
10000
0≤pi,ti≤10000
0≤pi,ti≤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
思路
输入初始温度与目标温度,因此只要将初始温度与目标温度的差值归零即可。
题意有两种操作方法:
1.仅操作一项
2.操作从
l
l
l 到
r
r
r 项的值,即改变
[
l
,
r
]
[l,r]
[l,r] 区间的值
可以建立差分数组快速修改某个区间的值,之后将差分数组归零即可。
代码
#include<iostream>
using namespace std;
const int N=100010;
int n,a[N];
int main() {
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
int t;
cin>>t;
a[i]-=t; //取温度差值
}
for(int i=n;i;i--) a[i]-=a[i-1]; //反向建立差分数组
int pos=0,neg=0; //pos储存差分数组中正数的和,neg储存负数的和并存为正数
for(int i=1;i<=n;i++){
if(a[i]>0) pos+=a[i];
else neg-=a[i];
}
cout<<max(pos,neg)<<endl; //输出pos和neg中的最大值
return 0;
}