區間問題,肯定是線段樹了,但是區間加的是乙個等差數列,怎麼辦呢
我們可以通過差分來維護。
蛤是差分?
搞乙個陣列專門差分,在陣列中記錄
對於l~r的區間加x,在l位置加上x,在r+1位置減去x。
當查詢某個數值時,該位置上的數加上差分陣列中1~該位置的字首和,自己出組數試一下發現這樣是對的
我們線段樹剛好可以區間修改和區間求和,所以這題要用到線段樹維護差分
的最後一項也就是a1+(r-l)d,這樣我們的區間加等差數列就維護好了。
單點查詢時,查詢線段樹中1~l的值加上原陣列中a[l]的值。
然後特別注意的是r+1>n的情況我們不必再修改,會re
對於l+1>r的情況,只需在l位置加上首項,l+1位置減去首項。
#include#include#define lson k<<1,l,mid
#define rson k<<1|1,mid+1,r
#define ls k<<1
#define rs k<<1|1
#define sum(rt) tr[rt].sum
#define laz(rt) tr[rt].laz
#define mid ((l+r)>>1)
using
namespace
std;
const
int maxn=100005
;int
n,m,a[maxn];
struct
nodetr[maxn
<<2
];inline
intread()
while(ch>='
0'&&ch<='9')
return s*w;
}inline
void update(int
k)inline
void down(int k,int l,int
r)void change(int k,int l,int r,int x,int y,int
val)
if(laz(k)!=0
)down(k,l,r);
if(x<=mid)change(lson,x,y,val);
if(y>mid)change(rson,x,y,val);
update(k);
}int ask(int k,int l,int r,int x,int
y)
if(laz(k)!=0
)down(k,l,r);
if(y<=mid)return
ask(lson,x,y);
else
if(x>mid)return
ask(rson,x,y);
else
return ask(lson,x,mid)+ask(rson,mid+1
,y);
}int
main()
else
}return0;
}
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 無聊的數列
無聊的yyb總喜歡搞出一些正常人無法搞出的東西。有一天,無聊的yyb想出了一道無聊的題 無聊的數列。k峰 這題不是傻x題嗎 維護乙個數列,支援兩種操作 1 1 l r k d 給出乙個長度等於r l 1的等差數列,首項為k,公差為d,並將它對應加到a l a r 的每乙個數上。即 令a l a l ...