分塊4 6280 數列分塊入門 4

2021-09-30 19:43:11 字數 1246 閱讀 8840

題目描述

給出乙個長為 nn 的數列,以及 nn 個操作,操作涉及區間加法,區間求和。

輸入格式

第一行輸入乙個數字 nn。

第二行輸入 nn 個數字,第 ii 個數字為 a_iai​,以空格隔開。

接下來輸入 nn 行詢問,每行輸入四個數字 \mathrmopt、ll、rr、cc,以空格隔開。

若 \mathrm = 0opt=0,表示將位於 [l, r][l,r] 的之間的數字都加 cc。

若 \mathrm = 1opt=1,表示詢問位於 [l, r][l,r] 的所有數字的和 \bmod (c+1)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

思路:此題和前面的沒有什麼區別,只需要去維護整塊內的和就行,不知整塊的去暴力加和。

ac**:

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

typedef long long int ll;

const int n=50000+10;

#define int long long

int v[n],pos[n],tag[n];//pos陣列儲存分塊情況,tag陣列儲存塊更新情況

int n,m;//m是有多少個完整的塊

int s[n];//每一塊的數值和

void add(int l,int r,int c)//塊更新

if(pos[l]!=pos[r])//如果lr不同塊 更新r的塊內的開頭到r

}for(int i=pos[l]+1;i<=pos[r]-1;i++)//lr之間的塊標記更新

}int query(int l,int r)

if(pos[l]!=pos[r])

}for(int i=pos[l]+1;i<=pos[r]-1;i++)

return sum;

}signed main()

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

return 0;

}

分塊3 6279 數列分塊入門 3

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

數列分塊入門2

題目鏈結 給出乙個長為 n 的數列,以及 n 個操作,操作涉及區間加法,詢問區間內小於某個值 的元素個數。根據數列分塊入門1的思想,把n個數分為根號n塊,不完整塊的去暴力求和和查詢,完整塊用加法標進行標記,查詢排序後進行二分查詢。include include include include inc...

數列分塊入門 2

題目描述 給出乙個長為n的數列,以及n個操作,操作涉及區間加法,詢問區間內小於某個值x的元素個數。輸入格式 第一行輸入乙個數字n。第二行輸入n個數字,第i個數字為ai,以空格隔開。接下來輸入n行詢問,每行輸入四個數字 opt l r c,以空格隔開。若opt 0 表示將位於 l,r 的之間的數字都加...