分析

这是一道典型的差分题。差分指的就是两项之间的差,即 \(b[i]=a[i]-a[i-1]\),而题目中影响温度变化的正是这一值。

所以我们就可以直接用 \(b\) 数组来直接判断三个规则来做这道题,那修改呢?这就是差分最重要的一个性质,修改一个片段只会影响差分数组内的两个值,其它修改的位置,它和它前面都修改了同样一个值,所以数值不变,因此每次修改单独将变化的两值拿出来更改答案即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline void read(int &res){
	res=0;
	int f=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')res=(res<<1)+(res<<3)+c-48,c=getchar();
	res*=f;
}
int n,m;
int s,t;
int ans;
int l,r,x;
int a[200005],b[200005];
signed main()
{
	read(n);read(m);read(s);read(t);
	read(a[0]);
	for(int i=1;i<=n;i++){
		read(a[i]);
		b[i]=a[i]-a[i-1];
		if(b[i]>0)ans-=b[i]*s;//规则3
		else ans+=-b[i]*t;//规则2 
	}
	for(int i=1;i<=m;i++){
		read(l);read(r);read(x);
		if(b[l]>0)ans+=b[l]*s;
		else ans-=-b[l]*t;//先将历史答案改掉 
		b[l]+=x;//a[l]加了,比l-1在原来基础上更多了x 
		if(b[l]>0)ans-=b[l]*s;
		else ans+=-b[l]*t;
		if(r==n){//特判,因为风吹到n+1和JOI先生并没有关系 
			printf("%lld\n",ans);
			continue;
		}
		if(b[r+1]>0)ans+=b[r+1]*s;
		else ans-=-b[r+1]*t;
		b[r+1]-=x;//a[r]加了,a[r+1]就比a[r]在原来基础上更少了x 
		if(b[r+1]>0)ans-=b[r+1]*s;
		else ans+=-b[r+1]*t;
		printf("%lld\n",ans);
	}
	return 0;
}
posted on 2021-09-15 21:41  漠寒·  阅读(61)  评论(0)    收藏  举报