并不对劲的loj2332

传送门->

维护海拔的差分数组。

h[i]表示海拔的差分数组,dt[i]表示温度的差分数组。

#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#define rep(i,x,y) for(register int i=(x);i<=(y);i++)
#define dwn(i,x,y) for(register int i=(x);i>=(y);i--)
#define maxn 200010
#define LL long long
#define ls (u<<1)
#define rs (u<<1|1)
#define mi (l+r>>1)
using namespace std;
int read()
{
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)&&ch!='-')ch=getchar();
	if(ch=='-')f=-1,ch=getchar();
	while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
	return x*f;
}
void write(LL x)
{
	int f=0;char ch[20];
	if(!x){putchar('0'),putchar('
');return;}
	if(x<0)x=-x,putchar('-');
	while(x)ch[++f]=x%10+'0',x/=10;
	while(f)putchar(ch[f--]);
	putchar('
');
}
int n,q;
LL s,t,h[maxn],dt[maxn],ans;
int main()
{
	n=read(),q=read(),s=read(),t=read();
	rep(i,0,n)h[i]=read();
	dwn(i,n,1)h[i]=h[i-1]-h[i];
	rep(i,1,n)dt[i]=h[i]<0?h[i]*s:h[i]*t,ans+=dt[i];
	while(q--)
	{
		int L=read(),R=read(),X=read();
		LL dtL=dt[L],dtR=dt[R+1];
		h[L]-=X,h[R+1]+=X;
		dt[L]=h[L]<0?h[L]*s:h[L]*t;
		if(R+1<=n)dt[R+1]=h[R+1]<0?h[R+1]*s:h[R+1]*t;
		ans+=dt[L]+dt[R+1]-dtL-dtR;
		write(ans);
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/xzyf/p/9671321.html