更好的閱讀體驗
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...