首页 > 代码库 > *模板--数据结构
*模板--数据结构
非递归线段树(未测试)
1 const int maxn=1e5+10; 2 int a[maxn],n; //原数组,从1开始 3 struct SegTree{ 4 int N; 5 int sum[maxn<<2],add[maxn<<2]; 6 7 //建树 8 void build(){ 9 N=1;while(N<n+2) N<<=1; 10 for(int i=1;i<=n;i++) sum[i+N]=a[i]; //原数组下标+N=存储下标 11 for(int i=N-1;i>0;i--){ 12 sum[i]=sum[i<<1]+sum[i<<1|1]; 13 add[i]=0; 14 } 15 } 16 17 //点修改,A[p]+=x 18 void update(int p,int x){ 19 for(int s=N+p;s;s>>=1){ 20 sum[s]+=x; 21 } 22 } 23 24 //点修改下的区间查询,求A[L..R]的和(不考虑懒惰标记add) 25 int query(int L,int R){ 26 int ans=0; 27 for(int s=N+L-1,t=N+R+1;s^t^1;s>>=1,t>>=1){ 28 if(~s&1) ans+=sum[s^1]; 29 if( t&1) ans+=sum[t^1]; 30 } 31 return ans; 32 } 33 34 //区间修改,A[L..R]+=c 35 void update(int L,int R,int c){ 36 int s,t,Ln=0,Rn=0,x=1; 37 for(s=N+L-1,t=N+R+1;s^t^1;s>>=1,t>>=1,x<<=1){ 38 sum[s]+=c*Ln; 39 sum[t]+=c*Rn; 40 if(~s&1) add[s^1]+=c,sum[s^1]+=c*x,Ln+=x; 41 if( t&1) add[t61]+=c,sum[t^1]+=c*x,Rn+=x; 42 } 43 for(;s;s>>=1,t>>=1){ 44 sum[s]+=c*Ln; 45 sum[t]+=c*Rn; 46 } 47 } 48 49 //区间修改下的区间查询,求A[L..R]的和 50 int query(int L,int R){ 51 int s,t,Ln=1,Rn=0,x=1; 52 int ans=0; 53 for(s=N+L-1,t=N+R+1;s^t^1;s>>=1,t>>=1,x<<=1){ 54 if(add[s]) ans+=Ln*add[s]; 55 if(add[t]) ans+=Rn*add[t]; 56 if(~s&1) ans+=sum[s^1],Ln+=x; 57 if( t&1) ans+=sum[t^1],Rn+=x; 58 } 59 //处理上层标记 60 for(;s;s>>=1;t>>=1){ 61 ans+=add[s]*Ln; 62 ans+=add[t]*Rn; 63 } 64 return ans; 65 } 66 };
*模板--数据结构
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。