P1438 無聊的數列(線段樹 差分)

2021-10-17 11:23:01 字數 2140 閱讀 6471

題目描述

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

1 l r k d:給出乙個長度等於 r−l+1 的等差數列,首項為 k,公差為 d,並將它對應加到 [l,r] 範圍中的每乙個數上。即:令 al=al+k……ar=ar+k+(r-l)*d

2 p:詢問序列的第 p 個數的值 ap。

輸入格式

第一行兩個整數數 n,m 表示數列長度和操作個數。

第二行 n 個整數,第 i 個數表示 ai。

接下來的 m 行,每行先輸入乙個整數 opt。

若 opt=1 則再輸入四個整數 l r k d;

若 opt=2 則再輸入乙個整數 p。

輸出格式

對於每個詢問,一行乙個整數表示答案。

輸入輸出樣例

輸入

5 21 2 3 4 5

1 2 4 1 2

2 3輸出

6

說明/提示

對於 100% 資料,0≤n,m≤10^5 , −200≤ai,k,d≤200 , 1≤l≤r≤n , 1≤p≤n。

題目分析

我們可以用線段樹維護乙個差分序列,這樣這個題就變成了乙個簡單的線段樹的模板題了。下面看一下兩個操作:

對於操作1,我們可以給l

ll位置上+k,給[l+1,r]區間上的每個數+d即可(根據差分的性質)

對於操作2,求ap位置上的數,因為維護的是差分序列,因此ap位置上的數即為1-p的和

**如下

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define pii pair

#define x first

#define y second

using

namespace std;

const

int n=

1e5+

5,inf=

0x3f3f3f3f

;struct nodetr[n*4]

;int a[n]

;void

pushup

(int u)

void

push

(int u,

int c)

//給當前段的所有數加c

void

pushdown

(int u)

//懶標記下放

}void

build

(int u,

int l,

int r)

//建樹

;else

;int mid=l+r>>1;

build

(u<<

1,l,mid)

,build

(u<<1|

1,mid+

1,r)

;pushup

(u);}}

void

update

(int u,

int l,

int r,

int c)

//給[l,r]區間上的數加c

}int

query

(int u,

int l,

int r)

//查詢[l,r]的區間和

intmain()

else

printf

("%d\n"

,query(1

,1,l))

;//操作2

}return0;

}

線段樹 差分 p1438 無聊的數列

維護乙個數列,支援兩種操作 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 詢問序列的...

P1438 無聊的數列 線段樹

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

洛谷P1438 無聊的數列 線段樹,差分

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