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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【AcWing 243. 一个简单的整数问题2】

發(fā)布時間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【AcWing 243. 一个简单的整数问题2】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

例題:【AcWing 243. 一個簡單的整數(shù)問題2】

線段樹模板題,區(qū)間修改區(qū)間求和。

題解:

將序列分成N/B塊,維護:

id[i] = i/B,i所在塊標號 res[id] = 第id塊的sum base[id] = 第id塊的add標記

修改時,大塊修改base[id],小塊修改a[i],同時維護每塊的res[id]。詢問時,大塊使用res[id]信息/小塊暴力。

總復雜度O(Q*sqrt(N))。

代碼:

#include<bits/stdc++.h> typedef long long ll; using namespace std; inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w; } const int maxn=1e5+9; int n,B,q; int a[maxn]; ll res[maxn],base[maxn]; ll query(int l,int r) {int idl=l/B,idr=r/B;ll ans=0;if(idl==idr){for(int i=l;i<=r;i++){ans+=a[i]+base[idl];} return ans;}else {for(int i=l;i<(idl+1)*B;i++){ans+=a[i]+base[idl];}for(int i=idl+1;i<idr;i++){ans+=res[i];}for(int i=idr*B;i<=r;i++){ans+=a[i]+base[idr];}//每個復雜度都是√N return ans;} } void change(int l,int r,int x) {int idl=l/B,idr=r/B;ll ans=0;if(idl==idr){for(int i=l;i<=r;i++){a[i]+=x;res[idl]+=x;}}else {for(int i=l;i<(idl+1)*B;i++){a[i]+=x;res[idl]+=x;}for(int i=idl+1;i<idr;i++){base[i]+=x;res[i]+=B*x;}for(int i=idr*B;i<=r;i++){a[i]+=x;res[idr]+=x;}//每個復雜度都是√N } } int main() {cin>>n>>q;B=sqrt(n);for(int i=1;i<=n;i++){cin>>a[i];res[i/B]+=a[i];}char op;int l,r,x;while(q--){cin>>op;if(op=='Q'){cin>>l>>r;cout<<query(l,r)<<endl;}else {cin>>l>>r>>x;change(l,r,x);} }return 0; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的【AcWing 243. 一个简单的整数问题2】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。