題目描述
給出乙個長為 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 的之間的數字都加...