LOJ 數列分塊入門 1

2021-10-09 06:30:14 字數 1087 閱讀 5459

link

優雅的暴力,對於乙個數列,他不是乙個元素乙個元素處理,而是分成若干塊,成塊成塊的處理,以此達到降低時間複雜度的目的。

首先,我們需要處理劃分的塊的大小—block(一般是根號n)、塊的數目、每乙個元素對應第幾塊,然後,每一塊的左端點和右端點。

完整的塊:更新:我們用lz[

i]

lz[i]

lz[i

]儲存第i

ii個塊整塊都要加上某個數的總和。

不完整的塊:更新:直接更新。

查詢:返回這個數和這個數所在塊的lz的和。

#include

using namespace std;

const

int maxn =

5e4+

100;

int a[maxn]

,block,n,num;

int l[maxn]

,r[maxn]

,belong[maxn]

,lz[maxn]

;void

init()

r[num]

= n;

}voidup(

int ql,

int qr,

int c)

for(

int i=belong[ql]+1

; i ;i++

)lz[i]

+= c;

for(

int i=ql;i<=r[belong[ql]

];i++

) a[i]

+= c;

for(

int i=l[belong[qr]

];i<=qr;i++

) a[i]

+= c;

}intqu(

int p)

intmain()

else

}}

LOJ 6277 數列分塊入門 1

給出乙個長為 n 的數列,以及 n 個操作,操作涉及區間加法,單點查值。第一行輸入乙個數字 n。第二行輸入 n 個數字,第 i 個數字為 a i 以空格隔開。接下來輸入 n 行詢問,每行輸入四個數字 mathrm,l,r,c,以空格隔開。若 mathrm 0 表示將位於 l,r 的之間的數字都加 c...

LOJ 6277 數列分塊入門 1(分塊入門)

記憶體限制 256 mib時間限制 100 ms標準輸入輸出 題目型別 傳統評測方式 文字比較 上傳者 hzwer 提交 提交記錄 統計討論 3 測試資料 題目描述 給出乙個長為 n 的數列,以及 n 個操作,操作涉及區間加法,單點查值。輸入格式 第一行輸入乙個數字 n。第二行輸入 n 個數字,第 ...

LOJ 6277 數列分塊入門 1 (分塊)

給出乙個長為 nnn 的數列,以及 nnn 個操作,操作涉及區間加法,單點查值。分塊,每次更新的話對塊兩側不完整的地方暴力更新,對完整的塊內部分打標記,查詢時直接返回資料值和標記部分的值即可。include using namespace std typedef long long ll const...