日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)

發布時間:2024/4/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#6280. 數列分塊入門 4

內存限制:256 MiB時間限制:500 ms標準輸入輸出 題目類型:傳統評測方式:文本比較 上傳者:?hzwer 提交提交記錄統計測試數據討論

題目描述

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

輸入格式

第一行輸入一個數字?nn。

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

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

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

若?\mathrm{opt} = 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

數據范圍與提示

對于?100\%100%?的數據,1 \leq n \leq 50000, -2^{31} \leq \mathrm{others}1n50000,?231others、\mathrm{ans} \leq 2^{31}-1ans231?1。

?

代碼;

1 //#6280. 數列分塊入門 4-區間加法,區間求和 2 #include<bits/stdc++.h> 3 using namespace std; 4 typedef long long ll; 5 const int maxn=5e4+10; 6 7 int n,m,pos[maxn]; 8 ll a[maxn],b[maxn],tag[maxn]; 9 10 void update(int l,int r,ll c) 11 { 12 for(int i=l;i<=min(pos[l]*m,r);i++){ 13 a[i]+=c; 14 b[pos[l]]+=c; 15 } 16 if(pos[l]!=pos[r]){ 17 for(int i=(pos[r]-1)*m+1;i<=r;i++){ 18 a[i]+=c; 19 b[pos[r]]+=c; 20 } 21 } 22 for(int i=pos[l]+1;i<pos[r];i++){ 23 tag[i]+=c; 24 } 25 } 26 27 ll query(int l,int r) 28 { 29 ll ans=0; 30 for(int i=l;i<=min(pos[l]*m,r);i++){ 31 ans+=a[i]+tag[pos[l]]; 32 } 33 if(pos[l]!=pos[r]){ 34 for(int i=(pos[r]-1)*m+1;i<=r;i++){ 35 ans+=a[i]+tag[pos[r]]; 36 } 37 } 38 for(int i=pos[l]+1;i<pos[r];i++){ 39 ans+=b[i]+tag[i]*m; 40 } 41 return ans; 42 } 43 44 int main() 45 { 46 scanf("%d",&n); 47 m=sqrt(n); 48 for(int i=1;i<=n;i++){ 49 scanf("%d",&a[i]); 50 b[i]=a[i]; 51 pos[i]=(i-1)/m+1; 52 } 53 for(int i=1;i<=m+1;i++){ 54 int cnt=0; 55 for(int j=(i-1)*m+1;j<=min(i*m,n);j++){ 56 cnt+=a[j]; 57 } 58 b[i]=cnt; 59 } 60 for(int i=1;i<=n;i++){ 61 int op,l,r; 62 ll c; 63 scanf("%d%d%d%lld",&op,&l,&r,&c); 64 if(op==0){ 65 update(l,r,c); 66 } 67 else{ 68 printf("%lld\n",query(l,r)%(c+1)); 69 } 70 } 71 } 72 73 74 /* 75 10 76 1 3 4 2 5 7 11 3 5 1 77 0 1 5 1 78 1 1 7 2 79 0 3 9 1 80 1 4 8 7 81 1 1 10 6 82 1 3 5 3 83 1 5 10 7 84 1 6 10 6 85 1 2 7 4 86 1 2 7 5 87 88 2 89 3 90 5 91 1 92 6 93 3 94 1 95 5 96 */

?

?

?

轉載于:https://www.cnblogs.com/ZERO-/p/10525669.html

總結

以上是生活随笔為你收集整理的LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。