分塊入門——區間加法,區間查詢x的字首
阿新 • • 發佈:2019-01-04
題目連結
給出一個長為 nn 的數列,以及 nn 個操作,操作涉及區間加法,詢問區間內小於某個值 xx 的前驅(比其小的最大元素)。
Input
第一行輸入一個數字 n,1≤n≤100000n,1≤n≤100000。
第二行輸入 n個非負整數,第 ii個數字為 ai(0≤ai≤109)ai(0≤ai≤109)以空格隔開。
接下來輸入n 行詢問,每行輸入四個數字 opt、l、r、c(c>0)opt、l、r、c(c>0),以空格隔開。
若 opt=0,表示將位於[l,r][l,r]的之間的數字都加 cc。
若 opt=1,表示詢問[l,r][l,r]中 cc 的前驅的值(不存在則輸出 −1−1)。
Output
對於每次詢問,輸出一行一個數字表示答案。
保證所有資料在int
範圍內
Sample Input
4 1 2 2 3 0 1 3 1 1 1 4 4 0 1 2 2 1 1 2 4
Sample Output
3 -1
像這種xjb更新,xjb查詢的都可以考慮用分塊做
要點:對於不是整個區間的暴力搜尋即可,對於是一個完整區間的二分查詢x;
用二分查詢的時候可以把每個塊用一個數組或是集合存下來,然後排序二分;
用集合的話就不需要手動sort了,再更新資料的時候也比較方便,只需要單個erase,單個的insert
如果用陣列的話需要對整個陣列進行重建,陣列維護區間排序的題解: L一道普通題