Description
输入一个长度为n的整数序列。
接下来输入m个操作,每个操作包含三个整数l, r, c,表示将序列中[l, r]之间的每个数加上c。
请你输出进行完所有操作后的序列。
Format
Input
第一行包含两个整数n和m。
第二行包含n个整数,表示整数序列。
接下来m行,每行包含三个整数l,r,c,表示一个操作。
1 ≤ n , m ≤ 100000 .
Output
共一行,包含n个整数,每个数字后面一个空格,表示最终序列。
Samples
输入数据 1
6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1
Copy
输出数据 1
3 4 5 3 4 2
没学差分前自己想的,有超时情况。
#include<stdio.h>
int main()
{
int n,m;
scanf("%d %d",&n,&m);
int a[n];
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int b[3];
for(int i=0;i<m;i++)
{
for(int j=0;j<3;j++)
{
scanf("%d",&b[j]);//新循环时新数据会替换老数据
}
for(int k=b[0];k<=b[1];k++)
{
a[k-1]+=b[2];
}
}
for(int i=0;i<n;i++)
{
printf("%d ",a[i]);
}
return 0;
}
学算法后:
#include <bits/stdc++.h>
using namespace std;
const int N = 100000;//注意不能直接a[n]
int main() {
int n, q;
scanf("%d %d", &n, &q);
int a[N], b[N];
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
b[i] = a[i] - a[i - 1];
}
for(int i=0;i<q;i++)
{
int l, r, v;
scanf("%d %d %d", &l, &r, &v);
b[l] += v;
b[r + 1] -= v;
}
for (int i = 1; i <= n; i++) {
b[i] += b[i - 1];
printf("%d ", b[i]);
}
return 0;
}