题目描述:原题链接
思路:
首先是差的形式,并且对区间进行了多次修改,不难想到差分。以元素个数为5为例,经推导结果为 a5-{a4-[a3-(a2-a1)]} ,所以要定义特殊的差分,每一个位置存的是当前数和(前一个数和再前一个数的差)的差,这样结果就可以简化为b[n]。首先可以发现如果修改区间的长度是偶数,那么它们之间就会把增量抵消,从而对结果无影响。当区间长度为奇数时要分情况讨论。当数组长度为奇数时,首先对上式做变形可以得到 a5-a4+a3-a2+a1 ,如果区间右端点为奇数最后会多加一个增量不能抵消掉,所以结果是b[n]+w,若是偶数则会多减一个增量,所以结果是b[n]-w。当数组长度为偶数时正好相反。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <iomanip>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N=500010;
int n,q,l,r,w,a[N];
long long d[N];
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
d[i]=a[i]-d[i-1];
}
scanf("%d",&q);
while (q--)
{
scanf("%d%d%d",&l,&r,&w);
if (n%2==1)
{
if (r%2==0 && (r-l+1)%2==1) d[n]-=w;
if (r%2==1 && (r-l+1)%2==1) d[n]+=w;
}
if (n%2==0)
{
if (r%2==0 && (r-l+1)%2==1) d[n]+=w;
if (r%2==1 && (r-l+1)%2==1) d[n]-=w;
}
printf("%lld\n",d[n]);
}
return 0;
}