文章
2
粉丝
265
获赞
4
访问
4.0k
本题的结果数组初始值都是0(一开始没有刷墙,则每一个点都是0)
差分数组初始化为0(结果数组都是0)
假设diff[]为我们的差分数组,结果数组为res[]
先解释一下diff[i]的含义 表示结果数组中下标为i-1的元素与下标为i的元素的差。
即diff[i]=res[i]-res[i-1]
说一下差分数组的操作,如果对结果数组res,从i到j同是加上(减去)一个数x。
差分数组的操作为 diff[i]+=x; diff[j+1]-=x;
diff[i]+=x; 从i开始后面的每个数都加上了x,diff[j+1]-=x;从j+1开始后面的每个数都减去了x;
实现了从i到j同是加上(减去)一个数x。在还原结果数组时,就会达到一个某个区间连续加减某个数。
还原结果数组 由diff[i]=res[i]-res[i-1] 可得res[i]=res[i-1]+diff[i], 将结果数组循环还原;
注意:差分数组一般都是从1开始的,(本题还有点,允许对下标为0的元素操作 所以res[0]=num[0])
for(int i=1;i<=200005;i++){
res[i]=res[i-1]+num[i];
}
本题时可以将结果数组和差分数组共用的,这也是大多数大佬的做法 num[i]+=num[i-1];
#include<stdio.h>
#include<string.h>
#include<math.h>
int main(){
int num[200005];
int res[200005];
int s,e;
int x,y;
memset(num,0,sizeof(num));//构造差分数组,差分数组初始值都为0;
memset(res,0,sizeof(res));
while(scanf("%d%d",&s...
登录后发布评论
暂无评论,来抢沙发