P1438 無聊的數列

2022-08-20 00:39:13 字數 1505 閱讀 7547

區間問題,肯定是線段樹了,但是區間加的是乙個等差數列,怎麼辦呢

我們可以通過差分來維護。

蛤是差分?

搞乙個陣列專門差分,在陣列中記錄

對於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 ...