题解 P2367 【语文成绩】

· · 题解

蒟蒻题解,有什么问题请大佬指出

思路

这题明显就是差分

根据差分数组的定义:d[i]=a[i]-a[i-1],可以发现,在d[x]上加上z,会让后面的学生全部加上z。↓

但这是把后面全部都加了,还要减掉一节,所以↓

把两个综合起来就是↓

所以每一次变化只要把d[x]+z,d[y+1]-z就好了。

因为d[i]=a[i]-a[i-1]

所以a[i-1]+d[i]=a[i]

最后再根据a[i-1]+d[i]=a[i]输出每一个同学的分数

代码

#include<bits/stdc++.h>
using namespace std;
int d[5000001];//d[i]表示a[i]-a[i-1] 
int a[5000001];
int main()
{
    int n,p,x,y,z,i,min=1e9;
    cin>>n>>p;
    for(i=1;i<=n;i++)
    {
        cin>>a[i];
    }

    for(i=1;i<=n;i++)
    {
        d[i]=a[i]-a[i-1];
    }
    for(i=0;i<p;i++)
    {
        cin>>x>>y>>z;
        d[x]+=z;
        d[y+1]-=z;
    }

    for(i=1;i<=n;i++)
    {
        a[i]=a[i-1]+d[i];
        if(min>a[i])
        {
            min=a[i];
        }
    }
    cout<<min;
    return 0;
}