题解 P2367 【语文成绩】
GoldenFishX · · 题解
蒟蒻题解,有什么问题请大佬指出
思路
这题明显就是差分
根据差分数组的定义: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;
}