題目描述
維護乙個數列 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 的每乙個數上。即...