首页 > 代码库 > [tem]线段树练习
[tem]线段树练习
1080 线段树练习
单点修改,区间查询和
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#define m ((l+r)>>1)#define lson o<<1,l,m#define rson o<<1|1,m+1,r#define lc o<<1#define rc o<<1|1using namespace std;typedef long long ll;const int N=1e5+5,INF=1e9+5;inline int read(){ char c=getchar();int x=0,f=1; while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();} return x*f;}int n,a[N],M,op,x,y;int t[N<<2];void build(int o,int l,int r){ if(l==r) t[o]=a[l]; else{ build(lson); build(rson); t[o]=t[lc]+t[rc]; }}void add(int o,int l,int r,int p,int v){ if(l==r) t[o]+=v; else{ if(p<=m) add(lson,p,v); else add(rson,p,v); t[o]=t[lc]+t[rc]; }}int query(int o,int l,int r,int ql,int qr){ if(ql<=l&&r<=qr) return t[o]; else{ int ans=0; if(ql<=m) ans+=query(lson,ql,qr); if(qr>m) ans+=query(rson,ql,qr); return ans; }}int main(int argc, const char * argv[]) { n=read(); for(int i=1;i<=n;i++) a[i]=read(); build(1,1,n); M=read(); for(int i=1;i<=M;i++){ op=read();x=read();y=read(); if(op==1){add(1,1,n,x,y);} else {printf("%d\n",query(1,1,n,x,y));} } return 0;}
1082 线段树练习 3
区间修改,区间查询和
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#define m (l+r)/2#define lson o<<1,l,m#define rson o<<1|1,m+1,r#define lc o<<1#define rc o<<1|1using namespace std;typedef long long ll;const int N=2e5+5,INF=1e9+5;inline int read(){ char c=getchar();int x=0,f=1; while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();} return x*f;}struct node{ ll lazy,x;}t[N<<2];int a[N];void build(int o,int l,int r){ if(l==r) t[o].x=a[l]; else{ build(lson); build(rson); t[o].x=t[lc].x+t[rc].x; }}void paint(int o,int l,int r,ll delta){ t[o].lazy+=delta; t[o].x+=delta*(r-l+1);}void pushDown(int o,int l,int r){ paint(lson,t[o].lazy); paint(rson,t[o].lazy); t[o].lazy=0;}void add(int o,int l,int r,int ql,int qr,ll v){ if(ql<=l&&r<=qr) paint(o,l,r,v); else{ pushDown(o,l,r); if(ql<=m) add(lson,ql,qr,v); if(m<qr) add(rson,ql,qr,v); t[o].x=t[lc].x+t[rc].x; }}ll query(int o,int l,int r,int ql,int qr){ if(ql<=l&&r<=qr) return t[o].x; else{ pushDown(o,l,r); ll ans=0; if(ql<=m) ans+=query(lson,ql,qr); if(m<qr) ans+=query(rson,ql,qr); return ans; }}int n,Q,flag,l,r,x;int main(){ n=read(); for(int i=1;i<=n;i++) a[i]=read(); build(1,1,n); Q=read(); for(int i=1;i<=Q;i++){ flag=read(); if(flag==1){ l=read();r=read();x=read(); add(1,1,n,l,r,x); }else{ l=read();r=read(); printf("%lld\n",query(1,1,n,l,r)); } }}
[tem]线段树练习
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。