【AcWing 243. 一个简单的整数问题2】
生活随笔
收集整理的這篇文章主要介紹了
【AcWing 243. 一个简单的整数问题2】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
例題:【AcWing 243. 一個簡單的整數問題2】
線段樹模板題,區間修改區間求和。
題解:
將序列分成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; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【AcWing 243. 一个简单的整数问题2】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【AcWing 249. 蒲公英】
- 下一篇: 机器学习、数据挖掘及其他