[tem]线段树练习
2016-10-07 23:27
204 查看
[b][b]1080 线段树练习[/b][/b]
[b]单点修改,区间查询和[/b]
PS:树状数组
[b]1082 线段树练习 3[/b]
区间修改,区间查询和
[b]单点修改,区间查询和[/b]
#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|1 using 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 ,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; }
PS:树状数组
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int N=1e5+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,Q,a ,c ,flag,l,r,x; inline int lowbit(int x){return x&-x;} void build(int n){ for(int i=1;i<=n;i++){ c[i]+=a[i]; if(i+lowbit(i)<=n) c[i+lowbit(i)]+=c[i]; } } void add(int x,int d){ for(int i=x;i<=n;i+=lowbit(i)) c[i]+=d; } int sum(int x){ int res=0; for(int i=x;i>0;i-=lowbit(i)) res+=c[i]; return res; } int main(int argc, const char * argv[]) { n=read(); for(int i=1;i<=n;i++) a[i]=read(); build(n); Q=read(); for(int i=1;i<=Q;i++){ flag=read(); if(flag==1){ l=read();x=read();add(l,x); }else{ l=read();r=read(); printf("%d\n",sum(r)-sum(l-1)); } } return 0; }
[b]1082 线段树练习 3[/b]
区间修改,区间查询和
#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|1 using 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 ; 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)); } } }
相关文章推荐
- CODEVS-1082-线段树练习3-splay
- codevs 1080 线段树练习 CDQ分治
- Codevs-4919 线段树练习4(区间加上一个值并求摸个区间整除k的数的个数,线段树+数组维护)
- 【codevs 1080】线段树练习
- hdu1394--Minimum Inversion Number(线段树求逆序数,纯为练习)
- codevs 1081 线段树练习 2 区间更新 单点查询 无lazy
- 线段树练习[单点更新] HDU 2795 Billboard
- 【线段树】Codevs线段树练习1.2.3及线段树学习笔记
- Buy Tickets---poj 2828 线段树单点更新练习
- codevs1080 线段树练习
- codevs 4919 线段树练习4
- <线段树系列2> codevs 1082 线段树练习2
- codevs4919 线段树练习4
- 1080 线段树练习 codevs
- codevs 1082 线段树练习3
- codevs 1080_线段树练习_树状数组
- [codevs]: 线段树练习1-4
- codevs 4927 线段树练习5
- codevs 1080~1082 线段树练习系列(模板)
- CODEVS 1081线段树练习2