洛谷 線段樹 P1438 無聊的數列

2021-09-17 21:24:11 字數 1476 閱讀 1649

無聊的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

【題意】:

這個題目就是  區域更新+單點詢問。但是這個區域更新是按照等差數列來更新的。

【題解】:

第一次寫線段樹的題解,我認為這個部落格很有必要寫,中石油做的那個題一樣,這個題目維護的就是a[i],a[i] = 第i個元素 和 第(i-1)個元素 的差值,然後如果想表示第i個值,那麼就是  [1,i] 區間求和得到。

這樣就是維護乙個差分陣列即可,

區間更新:[l,r] 相當於 update( l, l, 首相) + update (l+1,r,公差) + update( r+1,r+1,首相+(len-1)*公差) 

區域更新需要寫 pushdown + add ()

但是這個題目有兩個小坑,

1、l==r

2、r+1 == n

只要加以特判就不用更新這兩個位置了。

#include using namespace std;

typedef long long ll;

const int n=1e6+1010;

ll a[n<<2],lazy[n<<2],b[n<<2],n,m;

void add(int no,int l,int r,ll w)

void pushdown(int no,int l,int r)

void update(int no,int l,int r,int x,int y,ll v)

int main()

else

}return 0;

}

線段樹 洛谷P1438 無聊的數列

一開始嚇死,給區間加上乙個等差數列?然後就發現我們只要維護題目裡說的k,d兩個之就好了 比如我讀入是1,x,y,k,d 那麼對於在x y這個區間裡面的小區間l r 小區間的k,d值相應就是 k k d l x d d 這個很顯然把 換句話說,x y變成乙個等差序列,那麼對於i小區間l r顯然也是乙個...

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

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

洛谷 P1438 無聊的數列

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