洛谷P1438 無聊的數列 zkw線段樹

2022-04-30 09:30:08 字數 2106 閱讀 9157

題目傳送門

無聊的yyb總喜歡搞出一些正常人無法搞出的東西。有一天,無聊的yyb想出了一道無聊的題:無聊的數列。。。(k峰:這題不是傻x題嗎)

維護乙個數列,支援兩種操作:

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)。

輸出格式:

對於每個詢問,輸出答案,每個答案佔一行。

輸入樣例#1: 

5 2

1 2 3 4 5

1 2 4 1 2

2 3

輸出樣例#1: 

6

資料規模:

0≤n,m≤100000

|a[i]|,|k|,|d|≤200

hint:

有沒有巧妙的做法?

分析:剛學完$zkw$線段樹找道題來練練手。

關於這題,如果直接上一般的區間修改+單點查詢的話很難做,但是如果我們換個思路,運用差分的思想就會變得很容易了。

我們把線段樹維護的內容變成原數列的差分數列,也就是說$seg[i]=a[i]-a[i-1]$,那麼單點查詢的操作就變成了區間查詢。但是修改操作呢?

不難想到,因為是等差數列,所以差分陣列的修改值實際上就是等差數列的公差。所以修改區間$[l,r]$時,先單點修改$l$,修改值為等差數列首項,再單點修改$r+1$,修改值為$-(k+(r-l)*d)$(自己想想為什麼),最後再修改區間$[l+1,r]$,修改值為公差。就這樣了。

寫的$zkw$線段樹感覺還是常數有點大,總共跑了$335ms$,別人跑的快的只用$150ms$,不過至少比普通線段樹快多了。

code:

//

it is made by holselee on 5th sep 2018

p1438

#include#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const

int n=1e5+7

;int

n,m,maxn;

ll a[n],seg[n

<<2],sign[n<<2

];template

inline

void read(re &x)

while( ch>='

0' && ch<='9'

) flag ? x*=(-1) : 1;}

inline

void modify(int

pos,ll x)

inline

void update(int l,int

r,ll x)

for(; l; l>>=1,r>>=1) }

inline ll quary(

int l,int

r)

for(; l; l>>=1,r>>=1

) ret+=sign[l]*lum, ret+=sign[r]*rum;

return

ret;

}int

main()

for(int i=maxn-1; i>=1; --i) seg[i]=seg[i<<1]+seg[i<<1|1

];

intopt,l,r; ll x,y;

for(int i=1; i<=m; ++i)

else

}return0;

}

洛谷 P1438 無聊的數列

題目背景 無聊的yyb總喜歡搞出一些正常人無法搞出的東西。有一天,無聊的yyb想出了一道無聊的題 無聊的數列。k峰 這題不是傻x題嗎 題目描述 維護乙個數列,支援兩種操作 1 1 l r k d 給出乙個長度等於r l 1的等差數列,首項為k,公差為d,並將它對應加到a l a r 的每乙個數上。即...

洛谷 P1438 無聊的數列

1 多次對於區間加上乙個等差數列,引數為l,r,k,d,表示首項為k,公差為d,將乙個長度r l 1的等差數列加到區間l.r上 2 詢問乙個值a i 要加上乙個等差數列,很容易想到差分,因此將題目簡化至下 1 將a l 加上k 2 將a l 1.r 加上d 3 將a r 1 r l d k 而查詢的...

洛谷 P1438 無聊的數列

p1438 無聊的數列 題目背景 無聊的yyb總喜歡搞出一些正常人無法搞出的東西。有一天,無聊的yyb想出了一道無聊的題 無聊的數列。k峰 這題不是傻x題嗎 題目描述 維護乙個數列,支援兩種操作 1 1 l r k d 給出乙個長度等於r l 1的等差數列,首項為k,公差為d,並將它對應加到a l ...