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

2021-10-20 07:34:11 字數 2176 閱讀 5487

題意:

對於乙個陣列 a[]

aa[

],現在有兩個操作:

思路:操作一:因為對於乙個區間 [l,

r]

[l,r]

[l,r

], 在第 l

ll 位上加上 k

kk ,在區間 (l,

r]

(l, r]

(l,r

] 上加上 d

dd ,再在第 r+1

r+1r+

1 位上加上 −(k

+(r−

l)∗d

)-(k + (r - l) * d)

−(k+(r

−l)∗

d)。這樣對於陣列每一位上的修改就是對應的區間 [1,

i]

[1,i]

[1,i

] 的字首和,再加上陣列原來的值就是答案。

**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define fi first

#define se second

//#include

//#include

//srand((unsigned)time(null));

using

namespace std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

const

int inf =

0x3f3f3f3f

;using

namespace std;

const

int n =

2e6+10;

int a[n]

;int n, m;

#define ls (rt << 1)

#define rs ((rt << 1) | 1)

int tr[n]

, lz[n]

;void

build

(int l,

int r,

int rt)

int mid =

(l + r)

>>1;

build

(l, mid, ls)

;build

(mid +

1, r, rs)

; tr[rt]

= tr[ls]

+ tr[rs];}

void

pushdown

(int l,

int r,

int rt)

}int

query

(int s,

int t,

int l,

int r,

int rt)

void

modify

(int s,

int t,

int l,

int r,

int rt,

int v)

int mid =

(l + r)

>>1;

pushdown

(l, r, rt);if

(s <= mid)

modify

(s, t, l, mid, ls, v);if

(mid < t)

modify

(s, t, mid +

1, r, rs, v)

; tr[rt]

= tr[ls]

+ tr[rs];}

intmain()

build(1

, n,1)

;while

(m--

)else

if(opt ==2)

}return0;

}

luogu P1438 無聊的數列

區間 l 到 r 內加等差數列 已知首項為 k 公差為 d 那麼每一位加的數值為 k i l d l i r k i d l d l i r k l d i d l i r 我們可以分別加一下 k l d 和 i d 前者可以算出來,直接區間加就可以 後者的話,先維護一下 l,r 內的下標和 結合律...

luogu P1438 無聊的數列 差分 線段樹

題目描述 維護乙個數列 a i 支援兩種操作 1 l r k d 給出乙個長度等於 r l 1 的等差數列,首項為 k 公差為 d 並將它對應加到 l,r 範圍中的每乙個數上。即 令 a l a l k,a a k d ldots a r a r k r l times 2 p 詢問序列的第 p 個...

P1438 無聊的數列

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