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 僅由此就可以推出這個區間每乙個數要加上的數。可以發現兩個等差數列每一項相加,得到的還是等差數列,而且是首項和公差分別相加。對於區間的分解 標記的下傳 要用等差數列通項 求和 求項數公式手算一下。由父區間應加上的...