2017-11-18
TSOJ–1352
1.Sn数组:Sn=a1+a2+a3+...+an
an=Sn-Sn-1(n-1是下标)
2.dn数组:dn=an-an-1(n-1是下标)
如果[L,R]区间内ai的所有值加上同一个值v
则对于对应的di而言,等同于dL加1,对于[L+1,R]区间的di而言,di的值不变(ai-ai-1的差值是定的),dR+1减1
那么我们每次对区间[L,R]中的数据进行操作时我们就只用进行两次赋值操作即可(dL=dL+1,dR+1=dR+1-1)
这样我们就得到了dn的数组
进而得到an
最终得到Sn
代码
#include<iostream>
#include<cstring>
using namespace std;
const int N = 100000;
int a[N+1],s[N+1],d[N+1];
int main(){
int i,n,m,k,l,r;
while (cin>>n>>m>>k){
memset(a,0,sizeof(a));
memset(s,0,sizeof(s));
memset(d,0,sizeof(d));
for (i=1;i<=m;i++){
cin>>l>>r;
d[l]++;
d[r+1]--;
}
a[1]=d[1];
for (i=2;i<=n;i++){
a[i]=a[i-1]+d[i];
}
for (i=1;i<=n;i++){
s[i]=s[i-1]+a[i];
}
for (i=1;i<=k;i++){
cin>>l>>r;
cout<<s[r]-s[l-1]<<endl;
}
}
return 0;
}