一阶差分时间复杂度O(n*n),得分25
#include<iostream>//一阶差分过不了,时间复杂度大O(n*n)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int n,m;
cin>>n>>m;
ll *a=new ll [n+10];
ll sum=0;
memset(a,0,sizeof(ll)*(n+10));
// for(int i=0;i<n+10;i++)cout<<a[i]<<' ';
// cout<<endl;
int l,r;
ll s,e;
for(int i=1;i<=m;i++)
{
cin>>l>>r>>s>>e;
int d=(e-s)/(r-l);//求公差
a[l]+=s;
a[r+1]-=s;
if(d!=0){
for(int i=l+1;i<=r;i++)
{
a[i]+=d;
a[r+1]-=d;
}
}
}
for(int i=1;i<=n;i++)
{
a[i]=a[i-1]+a[i];
// cout<<a[i]<<' ';
sum+=a[i];
}
// cout<<endl;
cout<<sum<<endl;
delete[] a;
return 0;
}
二阶差分时间复杂度O(n),得分100
#include<iostream>//二阶差分时间复杂度O(n)
using namespace std;
//绝世武功(二阶差分数组)
typedef long long ll;
ll n,m,d,ans;//d:[s,e]公差
ll a[10000005],d1[10000005],d2[10000005];
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++){
ll l,r,s,e;
cin>>l>>r>>s>>e;
d=(e-s)/(r-l);//求出公差
d2[l]= d2[l]+s;//都加首项
d2[l+1]=d2[l+1]+d-s;
d2[r+1]=d2[r+1]-d-e;
d2[r+2]=d2[r+2]+e;
}
for(int i=1;i<=n;i++){
d1[i]=d1[i-1]+d2[i];//一阶
a[i]=a[i-1]+d1[i]; //二阶
ans+=a[i];
}
cout<<ans<<endl;
return 0;
} //二阶差分用于一个区间加不同的值:http://t.csdn.cn/iFmuJ
//通过原数组推一阶,把一阶当做原数组推二阶
//最好用三个数组,这样一个for就可以出来:必须一阶一阶的完成