分析:
a
a
a为原数组
b
b
b为
1
1
1次差分后数组
c
c
c为
2
2
2次差分后数组
要在区间
[
L
,
R
]
[L,R]
[L,R]中加上一个首项
s
s
s 公差
d
d
d 末项
t
=
s
+
(
R
−
L
)
×
d
t=s+(R-L)\times d
t=s+(R−L)×d的等差数列
对
a
a
a数组的影响:
a
i
=
a
i
+
s
+
(
i
−
L
)
×
d
a_i=a_i+s+(i-L)\times d
ai=ai+s+(i−L)×d
a
a
a数组变化对
b
b
b数组的影响 其中
b
i
=
a
i
−
a
i
−
1
b_i=a_i-a_{i-1}
bi=ai−ai−1
b
L
=
(
a
L
+
s
)
−
a
L
−
1
=
b
L
+
s
b_L=(a_L+s)-a_{L-1}=b_L+s
bL=(aL+s)−aL−1=bL+s
b
i
=
[
a
i
+
(
i
−
L
)
×
d
]
−
[
a
i
−
1
+
(
i
−
L
−
1
)
×
d
]
=
b
i
+
d
b_i=[a_i+(i-L)\times d]-[a_{i-1}+(i-L-1)\times d]=b_i+d
bi=[ai+(i−L)×d]−[ai−1+(i−L−1)×d]=bi+d
b
R
+
1
=
a
R
+
1
−
(
a
R
+
t
)
=
b
R
+
1
−
t
b_{R+1}=a_{R+1}-(a_R+t)=b_{R+1}-t
bR+1=aR+1−(aR+t)=bR+1−t
b
b
b数组变化对
c
c
c数组的影响 其中
c
i
=
b
i
−
b
i
−
1
c_i=b_i-b_{i-1}
ci=bi−bi−1
c
L
=
(
b
L
+
s
)
−
b
L
−
1
=
c
L
+
s
c_L=(b_L+s)-b_{L-1}=c_L+s
cL=(bL+s)−bL−1=cL+s
c
L
+
1
=
(
b
L
+
1
+
d
)
−
(
b
L
+
s
)
=
c
L
+
d
−
s
c_{L+1}=(b_{L+1}+d)-(b_L+s)=c_L+d-s
cL+1=(bL+1+d)−(bL+s)=cL+d−s
c
i
=
(
b
i
+
d
)
−
(
b
i
−
1
+
d
)
=
c
i
c_i=(b_i+d)-(b_{i-1}+d)=c_i
ci=(bi+d)−(bi−1+d)=ci
c
R
+
1
=
(
b
R
+
1
−
t
)
−
(
b
R
+
d
)
=
c
R
+
1
−
d
−
t
c_{R+1}=(b_{R+1}-t)-(b_R+d)=c_{R+1}-d-t
cR+1=(bR+1−t)−(bR+d)=cR+1−d−t
c
R
+
2
=
b
R
+
2
−
(
b
R
−
1
−
t
)
=
c
R
+
2
+
t
c_{R+2}=b_{R+2}-(b_{R-1}-t)=c_{R+2}+t
cR+2=bR+2−(bR−1−t)=cR+2+t
c c c数组只要改变 4 4 4个位置的值 然后两个前缀和就可以求出 a a a数组 就能求答案了
CODE:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=1e7+5;
int n,m,l,r,s,e,d;
ll a[N],b[N],c[N],ans,maxn;
int main()
{
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%d%d%d%d",&l,&r,&s,&e);
d=(e-s)/(r-l);
c[l]=c[l]+s;c[l+1]=c[l+1]+d-s;
c[r+1]=c[r+1]-d-e;c[r+2]=c[r+2]+e;
}
for(int i=1;i<=n;i++)
{
b[i]=b[i-1]+c[i];
a[i]=a[i-1]+b[i];
if(maxn<a[i]) maxn=a[i];
ans^=a[i];
}
printf("%lld %lld",ans,maxn);
return 0;
}