洛谷 P1438 無聊的數列

2021-08-11 01:13:44 字數 1351 閱讀 2712

1、多次對於區間加上乙個等差數列,引數為l,r,k,d,表示首項為k,公差為d,將乙個長度r-l+1的等差數列加到區間l..r上

2、詢問乙個值a[i]

要加上乙個等差數列,很容易想到差分,因此將題目簡化至下

1、將a[l]加上k;

2、將a[l+1..r]加上d;

3、將a[r+1]-[(r-l)*d+k].

而查詢的a[x]的操作隨之變為

求∑a[1..x]

於是這道題就是裸差分線段樹了,注意線段樹細節的問題,還有update之前判斷邊界問題,即

1、r>l(l+1..r加上d)

2、r<n(r+1減去一些東西)

#include

#define lc root<<1

#define rc root<<1|1

#define ll long long

#define maxn 100010

using namespace std;

struct tree

tree[maxn*4];

intx[maxn],a[maxn];

int n,m;

inline int

read()

while (ch>='0' && ch<='9')

return

x*f;

}inline void pushup(int root)

inline void build(int root,int l,int r)

int mid=l+r>>1;

build(lc,l,mid);

build(rc,mid+1,r);

pushup(root);

}inline void pushdown(int root)

inline void update(int root,int l,int r,ll delta)

if (tree[root].lazy) pushdown(root);

int mid=tree[root].left+tree[root].right>>1;

if (l<=mid) update(lc,l,r,delta);

if (midint root,int l,int r)

int main()

build(1,1,n);

for (int i=1;i<=m;i++)

else

}return

0;}

洛谷 P1438 無聊的數列

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

洛谷 P1438 無聊的數列

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

洛谷 P1438 無聊的數列

lazytag記錄一下某個區間需要加的等差數列的首項和公差。由於區間長度已知 r l 1 僅由此就可以推出這個區間每乙個數要加上的數。可以發現兩個等差數列每一項相加,得到的還是等差數列,而且是首項和公差分別相加。對於區間的分解 標記的下傳 要用等差數列通項 求和 求項數公式手算一下。由父區間應加上的...