题目链接: https://www.luogu.org/problemnew/solution/P4231
题意: 有m次询问每次给一段区间加上个等差序列
思路: 题目数据很大,若是用线段树或树状数组则TLE,所以我们想到了进行二次差分
l l+1 … r r+1 r+2
s d-s … 0 -e-d e
然后进行两次前缀和
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e7+5;
ll a[N],b[N],c[N];
int main()
{
int n,m;
ll maxx=-1,sum=0;
scanf("%d%d",&n,&m);
while(m--)
{
ll l,r,s,e;
scanf("%lld%lld%lld%lld",&l,&r,&s,&e);
ll d=(e-s)/(r-l);
a[l]+=s;
a[l+1]+=d-s;
a[r+1]+=-d-e;
a[r+2]+=e;
}
for(int i=1;i<=n;i++)
{
b[i]=b[i-1]+a[i];
c[i]=c[i-1]+b[i];
if(c[i]>maxx)
maxx=c[i];
sum^=c[i];
}
printf("%lld %lld\n",sum,maxx);
return 0;
}