解析
本题说明了样例的重要性
完全可以通过仔细观察样例得出一些结论
首先最大值显然就是max(b1,cn)\max(b_1,c_n)max(b1,cn)
考虑最优策略
如果a上升了,就让b上升
因为假设前面都拼的严丝合缝了,让c上升前面全得上升,肯定会对答案有影响,而修改b则不一定
如果a下降了,就让c下降
类似的原因,如果让b下降,就会影响到b1,那么b1小了,c1就会大,对答案产生影响
想到这些,后面维护差分就较为简单了
代码
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+100;
const int mod=1e9+7;
double eps=1e-10;
#define ll long long
ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();};while(isdigit(c)){x=x*10+c-'0';c=getchar();};return x*f;
}int n,m;ll d[N],a[N];
ll res;
int main(){#ifndef ONLINE_JUDGE//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);#endifn=read();for(int i=1;i<=n;i++){a[i]=read();d[i]=a[i]-a[i-1];if(i>1) res+=max(0ll,d[i]);//printf("i=%d res=%lld\n",i,res);}res+=a[1];printf("%lld\n",(res+(res>=0))/2);m=read();for(int i=1;i<=m;i++){int l=read(),r=read(),x=read();if(l==1) res-=d[l];else res-=max(0ll,d[l]);d[l]+=x;if(l==1) res+=d[l];else res+=max(0ll,d[l]);//printf("d=%lld res=%lld\n",d[l],res);if(r<n){res-=max(0ll,d[r+1]);d[r+1]-=x;res+=max(0ll,d[r+1]);}printf("%lld\n",(res+(res>=0))/2);}return 0;
}
/*
2 3
7 4 9 9
1 2 8
3 1
4 2 4
*/