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

2021-08-28 23:14:58 字數 1948 閱讀 9752

記憶體限制:256 mib時間限制:100 ms標準輸入輸出

題目型別:傳統評測方式:文字比較

上傳者: hzwer 提交

提交記錄

統計討論 3

測試資料

題目描述

給出乙個長為 n 的數列,以及 n 個操作,操作涉及區間加法,單點查值。

輸入格式

第一行輸入乙個數字 n。

第二行輸入 n 個數字,第 i 個數字為 ai,以空格隔開。

接下來輸入 n 行詢問,每行輸入四個數字 opt、l、r、c,以空格隔開。

若 opt=0,表示將位於 [l,r]的之間的數字都加 c。

若 opt=1,表示詢問 ar 的值(l 和 c 忽略)。

輸出格式

對於每次詢問,輸出一行乙個數字表示答案。

樣例

樣例輸入

4

1 2 2 3

0 1 3 1

1 0 1 0

0 1 2 2

1 0 2 0

樣例輸出

2

5

資料範圍與提示

對於100% 的資料,1≤n≤50000,−2^31≤others 、ans≤2^31−1。

有好多種寫法,因為在學分塊,就用分塊來寫了

將長度為n的陣列進行分塊,每個塊的長度

每次需要更新時,判斷需要更新的區間的左右端點是不是在乙個塊內,如果在乙個塊內,直接對這個區間進行更新就好了

如果不在乙個塊內,從左端點開始到左端點所在的塊的最後乙個元素進行陣列元素的更新,然後從右端點所在塊的第乙個元素開始到右端點進行陣列元素的更新,對於中間的那些塊,用tag陣列記錄下這個塊中的元素一共加了多少

最後輸出的時候輸出當前元素的值加上該元素所在塊的tag值就行了

/*

* @author: wzy

* @school: hpu

* @date: 2018-10-11 17:08:19

* @last modified by: wzy

* @last modified time: 2018-10-11 19:32:23

*/#include #include #include #include #include #include #include #include #include #include #include #include #include #define ll long long

#define ull unsigned long long

#define ms(a,b) memset(a,b,sizeof(a))

#define pi acos(-1.0)

#define inf 0x7f7f7f7f

#define lson o<<1

#define rson o<<1|1

#define bug cout

// 每個塊的長度為sqrt(n)

block=sqrt(n);

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

cin>>a[i];

// 計算下標1~n屬於哪個塊

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

blo[i]=(i-1)/block+1;

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

#ifndef online_judge

double _end_time = clock();

printf("time = %lf ms.", _end_time - _begin_time);

#endif

return 0;

}

LOJ 6277 數列分塊入門 1

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

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

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

LibreOJ 6277 數列分塊入門 1 分塊

題解 感謝hzwer學長和loj讓本蒟蒻能夠找到如此合適的入門題做.這是一道非常標準的分塊模板題,本來用打標記的線段樹不知道要寫多少行,但是分塊只有這麼幾行,極其高妙.如下 include include include include include using namespace std int...