Noe


私信TA

用户名:Noe

访问量:928

签 名:

然后便去远方

等  级
排  名 31411
经  验 438
参赛次数 0
文章发表 4
年  龄 19
在职情况 学生
学  校 中北大学
专  业 计算机类

  自我简介:

TA的其他文章

输入一个长度为 nn 的整数序列。

接下来再输入 mm 个询问,每个询问输入一对 l,rl,r。

对于每个询问,输出原序列中从第 ll 个数到第 rr 个数的和。

输入格式

第一行包含两个整数 nn 和 mm。

第二行包含 nn 个整数,表示整数数列。

接下来 mm 行,每行包含两个整数 ll 和 rr,表示一个询问的区间范围。

输出格式

共 mm 行,每行输出一个询问的结果。

数据范围

1≤l≤r≤n1≤l≤r≤n,
1≤n,m≤1000001≤n,m≤100000,
−1000≤数列中元素的值≤1000−1000≤数列中元素的值≤1000

输入样例:

5 3
2 1 3 6 4
1 2
1 3
2 4

输出样例:

3
6
10

给出差分模板代码:

#include<iostream>

using namespace std;

int const N=1e5+10;

int a[N],b[N];

void insert(int l,int r,int c)

{

b[l]+=c;

b[r+1]-=c;

}

int main() {

int n,m;

scanf("%d%d",&n,&m);

for(int i=1; i<=n; i++)scanf("%d",&a[i]);

for(int i=1; i<=n; i++)insert(i,i,a[i]);

while(m--)

{

int l,r,c;

scanf("%d%d%d",&l,&r,&c);

insert(l,r,c);

 

}

for(int i=1; i<=n; i++)b[i]+=b[i-1];

for(int i=1; i<=n; i++)printf("%d ",b[i]);

return 0;

}

思路:

差分即 通过

b[1]=a[1]

b[2]=a[2]-a[1]

b[3]=a[3]-a[2]

.

.

.

b[n]=a[n]-a[n-1];

则此时 a[i]数组的任意一项即为 b[i]的前缀和,例如 a[3]=b[3]+b[2]+b[1]=a[3]-a[2]+a[2]-a[1]+a[1];

那么此时即可通过求 b的前缀和实现对 a[i]数组进行插入操作;

第一步构造一个b[i]数组 实现 b[i]=a[i]-a[i-1];

代码实现为:

void insert(int l,int r,int c)

{

b[l]+=c;

b[r+1]-=c;

}

for(int i=1; i<=n; i++)insert(i,i,a[i]);

例如:前提定义全局数组时 自动将所有数组的元素初始化为0

当i=1 b[1]=b[1]+a[1]=0+a[1]=a[1];

          b[2]=b[2]-a[1]=-a[1]=0-a[1]=-a[1];

当i=2

         b[2]=b[2]+a[2]=a[2]-a[1];(此时经过第一步的处理后b[2]!=0 而b[2]=-a[1]);

         b[3]=b[3]-a[2]=-a[2];

.

.

.

当i=n时

         b[n]=b[n]+a[n]=a[n]-a[n-1];

         b[n+1]=b[n+1]-a[n]=-a[n];

从而实现 b[n=a[n]-a[n-1];



   

 

0.0分

0 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答

代码解释器

  评论区