无聊的数列

我只是一个虾纸丫 提交于 2019-11-25 19:46:56

题目描述

维护一个数列{a[i]},支持两种操作:

1、1 L R K D:给出一个长度等于R-L+1的等差数列,首项为K,公差为D,并将它对应加到a[L]~a[R]的每一个数上。即:令a[L]=a[L]+K,a[L+1]=a[L+1]+K+D,

a[L+2]=a[L+2]+K+2D……a[R]=a[R]+K+(R-L)D。

2、2 P:询问序列的第P个数的值a[P]。

输入格式

第一行两个整数数n,m,表示数列长度和操作个数。

第二行n个整数,第i个数表示a[i](i=1,2,3…,n)。

接下来的m行,表示m个操作,有两种形式:

1 L R K D

2 P 字母意义见描述(L≤R)。

输出格式

对于每个询问,输出答案,每个答案占一行。

输入样例

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

输出样例

6

说明/提示

数据规模:

0≤n,m≤100000

|a[i]|,|K|,|D|≤200

 

我们考虑,对于一段区间[l,r][l,r],我们只需要记录它的区间的首相和公差,就能将这个标记下传了

QwQ哇,那可以只使用这个线段树进行一个标记下传了(所以没有up函数)

这里展示一下pushdown的部分
f[root].df[root].d表示公差,f[root].firstf[root].first表示首相

因为,等差数列相加依然是等差数列,所以对于公差和首相,可以直接加

对一个区间的话[l,r][l,r],[l,mid][l,mid]这部分可以直接进行加法,而对于[mid+1,r][mid+1,r]稍微操作一下,修改首相即可
求和什么的,也比较简单

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!