題解 LibreOJ6277 數列分塊入門 1

2022-05-16 10:40:31 字數 954 閱讀 4936

更好的閱讀體驗

portal1: libreoj

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

第一行輸入乙個數字\(n\)。

第二行輸入\(n\)個數字,第\(i\)個數字為\(a_i\),以空格隔開。

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

若\(\texttt\),表示將位於\([l,r]\)的之間的數字都加\(c\)。

若\(\texttt\),表示詢問\(a_i\)的值(\(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 \le n \le 50000, -2^ \le others, ans \le 2^ - 1\)。

分塊,先將序列分成\(\sqrt\)塊,區間加法時,整塊左右的邊角料暴力處理,整的塊來更新懶標記。單點求值時,只要把自己的值與它所在的塊的懶標記加起來就可以了。

#include#include#include#include#includeusing namespace std;

const int maxn = 50005;

int n, a[maxn], bl[maxn], tag[maxn];

int main()

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

} else printf("%d\n", a[y] + tag[bl[y]]);//單點求值

}return 0;

}

LibreOJ 6277 數列分塊入門 1 分塊

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

數列分塊入門 1 LibreOJ 6277

有趣的分塊理論講解 給出乙個長為 n n n 的數列,以及 n n n 個操作,操作涉及區間加法,單點查值。input 第一行輸入乙個數字 n n n。第二行輸入 n n n 個數字,第 i i i 個數字為 a i ai ai,以空格隔開。接下來輸入 n n n 行詢問,每行輸入四個數字 opt ...

LibreOJ6279 數列分塊入門 3 題解

題目描述 給出乙個長為 n 的數列,以及 n 個操作,操作涉及區間加法,詢問區間內小於某個值 x 的前驅 比其小的最大元素 輸入格式 第一行輸入乙個數字 n 第二行輸入 n 個數字,第 i 個數字為 a i 以空格隔開。接下來輸入 n 行詢問,每行輸入四個數字 opt l r c 以空格隔開。若 o...