文章

2

粉丝

265

获赞

4

访问

3.9k

头像
差分数组解决数组区间频繁加减一个数
P1209
发布于2023年3月25日 15:32
阅读数 1.8k

 本题的结果数组初始值都是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...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发