P1438 無聊的數列

2022-04-30 21:48:15 字數 1980 閱讀 9981

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

有沒有巧妙的做法?

解析:這道題我跟一條題解想到一塊去了。

具體做法大概就是維護一條差分序列。為啥要維護差分序列呢?這個是可以從等差數列這個點看出來的。

等差數列的性質決定了它可以用差分序列維護,這就保證了線段樹的可結合性。

跟不要說,題目寫的很清楚的一則這個玩意:

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。

更是側面應證了我們的思路的正確性。

打幾個草稿就能發現此差分數列維護規律:

若差分序列為 d,執行操作 1 l r k d

至於具體原因,詳見差分序列性質,思考一下很容易明白。

#include#include

#include

#define n 100010

#define ll long long

using

namespace

std;

ll a[n],b[n];

struct

segmentreet[n

<<2

];void build(int p,int l,int

r)

int mid=(l+r)>>1

; build(p

<<1

,l,mid);

build(p

<<1|1,mid+1

,r);

t[p].dat=t[p<<1].dat+t[p<<1|1

].dat;

}void pushdown(intp)}

void change(int p,int l,int

r,ll val)

pushdown(p);

int mid=(t[p].l+t[p].r)>>1

;

if(l<=mid) change(p<<1

,l,r,val);

if(r>mid) change(p<<1|1

,l,r,val);

t[p].dat=t[p<<1].dat+t[p<<1|1

].dat;

}ll query(

int p,int l,int

r)int

main()

build(

1,1,n);

while(m--)

else

if(r>=n)

else

}else

}return0;

}

2019-05-17 14:23:49

P1438 無聊的數列

板子題 按照ppt所說的,預留0號位和n 1號位,0號位位於2的若干次方的位置。但是我試了一下。沒有嚴格要求的這樣的寫法,這題也能a,資料有點水。include include include include include include include include include inclu...

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

區間問題,肯定是線段樹了,但是區間加的是乙個等差數列,怎麼辦呢 我們可以通過差分來維護。蛤是差分?搞乙個陣列專門差分,在陣列中記錄 對於l r的區間加x,在l位置加上x,在r 1位置減去x。當查詢某個數值時,該位置上的數加上差分陣列中1 該位置的字首和,自己出組數試一下發現這樣是對的 我們線段樹剛好...