給出乙個長為 n 的數列,以及 n 個操作,操作涉及區間加法,區間求和。
第一行輸入乙個數字 n。
第二行輸入 n 個數字,第 i 個數字為 \(a_i\),以空格隔開。
接下來輸入 n 行詢問,每行輸入四個數字 \(\mathrm、l、r、c\),以空格隔開。
若 \(\mathrm = 0\),表示將位於 \([l,r]\) 的之間的數字都加 c。
若 \(\mathrm = 1\),表示詢問位於 \([l,r]\) 的所有數字的和 \(\mod (c+1)\)。
對於每次詢問,輸出一行乙個數字表示答案。
4
1 2 2 3
0 1 3 1
1 1 4 4
0 1 2 2
1 1 2 4
1
4
對於區間加,如果是整塊,打標記,並修改區間的和
如果是散塊,暴力修改,別忘了所屬塊的修改
對於區間查詢,對於整塊,直接加維護的和
對於散塊,直接加對應位置的值+標記!
#include#include#include#include#include#include#include#include#define _ 0
#define ll long long
#define space putchar(' ')
#define enter putchar('\n')
#define fuu(x,y,z) for(int x=(y),x##end=z;x<=x##end;x++)
#define fu(x,y,z) for(int x=(y),x##end=z;x=x##end;x--)
#define fd(x,y,z) for(int x=(y),x##end=z;x>x##end;x--)
#define mem(x,y) memset(x,y,sizeof(x))
#ifndef olinr
inline char getc()
#else
#define getc() getchar()
#endif
templateinline void in(t &x)
const int inf=0x7fffffff;
int n,num;
struct k
}e[50505];
struct seq
a[50550];
inline void init()
}inline void add(int l,int r,ll c)
inline ll query(int l,int r,ll c)
int main()
return ~~(0^_^0);
}
loj 6280 數列分塊入門 4
題目 傳送門 簡要題意 給出乙個長為 n的數列,以及 n個操作,操作涉及區間加法,區間求和。題解 第一反應.線段樹.然後再去想分塊 有點水.也是運用lazy的思想啊,先存一下每一塊的和,對於頭尾就可以直接加 記得更新分塊和 然後中間的塊直接把和加上去,隨便檢查一下細節就搞定了。1 include2 ...
LibreOJ 6280 數列分塊入門 4
題意 給你乙個n個整數的序列,讓你進行兩種操作 分析 這裡用分塊 這題直接做就行了,要先預處理下各塊的元素和,對它進行維護 修改的時候,對區間的不完整塊進行暴力,若是完整塊,就加到標記上 對於查詢,不完整塊暴力求和,完整塊,拿標記乘以區間長度並加上塊的元素和 include include incl...
LOJ 數列分塊入門 1
link 優雅的暴力,對於乙個數列,他不是乙個元素乙個元素處理,而是分成若干塊,成塊成塊的處理,以此達到降低時間複雜度的目的。首先,我們需要處理劃分的塊的大小 block 一般是根號n 塊的數目 每乙個元素對應第幾塊,然後,每一塊的左端點和右端點。完整的塊 更新 我們用lz i lz i lz i ...