差分数组
问题 1501: [蓝桥杯][算法提高VIP]分苹果
时间限制: 1Sec 内存限制: 128MB 提交: 340 解决: 89
题目描述
小朋友排成一排,老师给他们分苹果。
小朋友从左到右标号1…N。有M个老师,每次第i个老师会给第Li个到第Ri个,一共Ri-Li+1个小朋友每人发Ci个苹果。
最后老师想知道每个小朋友有多少苹果。
数据规模和约定
100%的数据,N、M≤100 000,1≤Li≤Ri≤N,0≤Ci≤100。
输入
第一行两个整数N、M,表示小朋友个数和老师个数。
接下来M行,每行三个整数Li、Ri、Ci,意义如题目表述。
输出
一行N个数,第i个数表示第i个小朋友手上的水果。
样例输入
5 3
1 2 1
2 3 2
2 5 3
样例输出
1 6 5 3 3
int main()
{
int n,m;//小朋友数 老师数
scanf("%d %d",&n,&m);
int li,ri,ci;
int child[n],i,j;
for(i=0;i<n;i++)
{
child[i]=0;
}
for(i=0; i<m; i++)
{
scanf("%d %d %d",&li,&ri,&ci);
for(j=li; j<=ri; j++)
{
child[j-1]+=ci;
}
}
for(i=0; i<n; i++)
{
printf("%d ",child[i]);
}
return 0;
}
如果用差分数组复杂度就会低一些也就可以ac
int child[100005];
int main()
{
int n, m;
scanf("%d%d",&n,&m);
int li,ri,ci;
while(m--)
{
scanf("%d%d%d",&li,&ri,&ci);
child[li] += ci;
child[ri+1] -= ci;
}
for(int i = 1; i <= n; i++)
{
child[i] += child[i-1];
printf("%d ",child[i]);
}
return 0;
}