给你一个数组对其进行区间修改和区间求和。 线段树基础模板。
题目链接
题意:
思路:
代码:
#include<bits/stdc++.h> using namespace std; #define int long long #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); const int N=1e5+5; const int inf=0x3f3f3f3f; int n,m,a[N],ans[N<<2],tag[N<<2]; int ls(int x) { return x*2; } int rs(int x) { return x*2+1; } void push_up(int p) { ans[p]=ans[ls(p)]+ans[rs(p)]; } void build(int p,int l,int r) { tag[p]=0; if(l==r) { ans[p]=a[l]; return ; } int mid=(l+r)/2; build(ls(p),l,mid); build(rs(p),mid+1,r); push_up(p); } void f(int p,int l,int r,int k) { tag[p]=tag[p]+k; ans[p]=ans[p]+k*(r-l+1); } void push_down(int p,int l,int r) { int mid=(l+r)/2; f(ls(p),l,mid,tag[p]); f(rs(p),mid+1,r,tag[p]); tag[p]=0; } void update(int nl,int nr,int l,int r,int p,int k) { if(nl<=l&&r<=nr) { ans[p]+=k*(r-l+1); tag[p]+=k; return ; } push_down(p,l,r); int mid=(l+r)/2; if(nl<=mid) { update(nl,nr,l,mid,ls(p),k); } if(nr>mid) { update(nl,nr,mid+1,r,rs(p),k); } push_up(p); } int query(int x,int y,int l,int r,int p) { int res=0; if(x<=l&&r<=y) { return ans[p]; } int mid=(l+r)/2; push_down(p,l,r); if(x<=mid) { res+=query(x,y,l,mid,ls(p)); } if(y>mid) { res+=query(x,y,mid+1,r,rs(p)); } return res; } signed main() { cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i]; } build(1,1,n); for(int i=1;i<=m;i++) { int a,x,y,z; cin>>a; if(a==1) { cin>>x>>y>>z; update(x,y,1,n,1,z); } else { cin>>x>>y; cout<<query(x,y,1,n,1)<<endl; } } return 0; }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算