LOJ 6280 數列分塊入門 4

2022-07-20 04:39:08 字數 1409 閱讀 5005

給出乙個長為 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 ...