4448: 【例】【基础】倒水(2062)
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:17
解决:8
题目描述
在一个桌子上摆放了 个杯子,每个杯子中有一定量的水。小 同学负责向杯子中倒水,他总共倒了 次,每次会向从第 个杯子到第 个杯子中添加 毫升的水(注意:水只可能增加,不可能减少)。
请问小 同学倒了 次水之后, 个杯子每个杯子有多少毫升的水。
输入
第一行包含两个整数 和 。
第二行包含 个整数,表示一开始每个杯子中水的毫升数。
接下来 行,每行包含三个整数 ,表示一次操作。
数据范围
。
,。
杯子中水的初始量在 的范围内。
本题数据上保证所有的杯子在加水之后,水量值仍然在 int 范围内。
输出
共一行,包含 个整数,表示最终 个杯子每个杯子有多少毫升的水。
样例输入 复制
8 3
1 2 10 8 1 5 1 1
7 8 12
1 8 4
2 3 12
样例输出 复制
5 18 26 12 5 9 17 17
提示

//解法一:利用原数组求差分数组
#include <bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N],b[N]; //a代表读入的原数组,b代表是差分数组
int n,k,l,r,p;
int main(){
cin>>n>>k;
for(int i=1;i<= n;i++){
cin>>a[i]; //求差分数组
b[i]= a[i]- a[i-1];
}
//k 次操作
for(int i= 1;i<= k;i++){
cin>>l>>r>>p;
b[l]=b[l]+ p;
b[r+1]=b[r+1]-p;
}
//求b数组的前缀和,就是a数组做了k次操作的结果
for(int i=1;i<= n;i++){
b[i]= b[i-1] + b[i];
cout<<b[i]<<" ";
}
return 0;
}
//解法二:读入时直接求差分数组
#include <bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N],b[N]; //a代表读入的原数组,b代表是差分数组
int n,k,l,r,p;
int main(){
cin>>n>>k;
for(int i=1;i<= n;i++){
//cin>>a[i]; //每读入一个数,直接求出对应的差分数组
cin>>p;
//求差分数组
//b[i]= a[i]- a[i-1];
b[i]= b[i]+ p;
b[i+1]= b[i+1]- p;
}
//k 次操作
for(int i= 1;i<= k;i++){
cin>>l>>r>>p;
b[l]=b[l]+ p;
b[r+1]=b[r+1]-p;
}
//求b数组的前缀和,就是a数组做了k次操作的结果
for(int i=1;i<= n;i++){
b[i]= b[i-1]+ b[i];
cout<<b[i]<<" ";
}
return 0;
}