线段树板子

耗费了两天AC了线段树的两道模板。就把我自己的代码贴出来以后DEBUG的时候做个参考吧。

1|0线段树壹

#include <cstdio> typedef long long ll; const int N = 100000+10; int n,m; ll a[N]; struct Segment_Tree { #define lson (o<<1) #define rson (o<<1|1) ll sumv[N<<2],addv[N<<2]; void pushup(int o) { sumv[o]=sumv[lson]+sumv[rson]; } void pushdown(int o,int l,int r) { if(addv[o]) { int mid=(l+r)>>1; sumv[lson]+=addv[o]*(mid-l+1); sumv[rson]+=addv[o]*(r-mid); addv[lson]+=addv[o]; addv[rson]+=addv[o]; addv[o]=0; } } void bulid(int o,int l,int r) { if(l == r) { sumv[o]=a[l]; return ; } addv[o]=0; int mid=(l+r)>>1; bulid(lson,l,mid);bulid(rson,mid+1,r); pushup(o); } void change(int o,int l,int r,int q,ll v) { if(l == r) { sumv[o]+=v; } int mid=(l+r)>>1; if(q <= mid) { change(lson,l,mid,q,v); } else { change(rson,mid+1,r,q,v); } pushup(o); } void optadd(int o,int l,int r,int ql,int qr,ll v) { if(ql<=l && r<=qr) { addv[o]+=v;sumv[o]+=(r-l+1)*v; return ; } int mid=(l+r)>>1; pushdown(o,l,r); if(ql <= mid) { optadd(lson,l,mid,ql,qr,v); } if(qr > mid) { optadd(rson,mid+1,r,ql,qr,v); } pushup(o); } ll querysum(int o,int l,int r,int ql,int qr) { if(ql<=l && r<=qr) { return sumv[o]; } int mid=(l+r)>>1; ll ans=0; pushdown(o,l,r); if(ql <= mid) { ans+=querysum(lson,l,mid,ql,qr); } if(qr > mid) { ans+=querysum(rson,mid+1,r,ql,qr); } return ans; } }; int main(void) { scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) { scanf("%lld",&a[i]); } Segment_Tree T; T.bulid(1,1,n); for(int i=1; i<=m; i++) { int k; scanf("%d",&k); if(k == 1) { ll x,y,v; scanf("%lld%lld%lld",&x,&y,&v); T.optadd(1,1,n,x,y,v); } else { ll x,y; scanf("%lld%lld",&x,&y); printf("%lld\n",T.querysum(1,1,n,x,y)); } } return 0; }

2|0线段树贰

#include <cstdio> int P; const int N = 100000+10; int a[N]; struct Segment_Tree { #define lson (o<<1) #define rson (o<<1|1) #define ll long long ll sumv[N<<2],addv[N<<2],mulv[N<<2]; ll mul(ll a,ll b) { return (a*b)%P; } ll sum(ll a,ll b) { return (a+b)%P; } void pushup(int o) { sumv[o]=sum(sumv[lson],sumv[rson]); } void pushdown(int o,int l,int r) { if(!addv[o] && mulv[o] == 1) { return ; } int mid=(l+r)>>1; sumv[lson]=mul(sumv[lson],mulv[o]); sumv[rson]=mul(sumv[rson],mulv[o]); mulv[lson]=mul(mulv[lson],mulv[o]); mulv[rson]=mul(mulv[rson],mulv[o]); sumv[lson]=sum(sumv[lson],addv[o]*(mid-l+1)); sumv[rson]=sum(sumv[rson],addv[o]*(r-mid)); addv[lson]=sum(mul(addv[lson],mulv[o]),addv[o]); addv[rson]=sum(mul(addv[rson],mulv[o]),addv[o]); addv[o]=0;mulv[o]=1; } void bulid(int o,int l,int r) { mulv[o]=1; addv[o]=0; if(l == r) { sumv[o]=a[l]; return ; } int mid=(l+r)>>1; bulid(lson,l,mid);bulid(rson,mid+1,r); pushup(o); } void optadd1(int o,int l,int r,int ql,int qr,int v) { if(ql<=l && r<=qr) { sumv[o]=mul(sumv[o],v); mulv[o]=mul(mulv[o],v); addv[o]=mul(addv[o],v); return ; } int mid=(l+r)>>1; pushdown(o,l,r); if(ql <= mid) { optadd1(lson,l,mid,ql,qr,v); } if(qr > mid) { optadd1(rson,mid+1,r,ql,qr,v); } pushup(o); } void optadd2(int o,int l,int r,int ql,int qr,int v) { if(ql<=l && r<=qr) { sumv[o]=sum(sumv[o],mul(v,(r-l+1)));addv[o]=sum(addv[o],v); return ; } int mid=(l+r)>>1; pushdown(o,l,r); if(ql <= mid) { optadd2(lson,l,mid,ql,qr,v); } if(qr > mid) { optadd2(rson,mid+1,r,ql,qr,v); } pushup(o); } ll querysum(int o,int l,int r,int ql,int qr) { if(ql<=l && r<=qr) { return sumv[o]; } int mid=(l+r)>>1; ll sum=0; pushdown(o,l,r); if(ql <= mid) { sum+=querysum(lson,l,mid,ql,qr); } if(qr > mid) { sum+=querysum(rson,mid+1,r,ql,qr); } return sum; } }T; int main(void) { int n,m; scanf("%d%d%d",&n,&m,&P); for(int i=1; i<=n; i++) { scanf("%lld",&a[i]); } T.bulid(1,1,n); for(int i=1; i<=m; i++) { int p; scanf("%d",&p); if(p == 3) { int x,y; scanf("%d%d",&x,&y); printf("%lld\n",T.querysum(1,1,n,x,y)%P); } else { int x,y,z; scanf("%d%d%d",&x,&y,&z); if(p == 1) { T.optadd1(1,1,n,x,y,z); } else { T.optadd2(1,1,n,x,y,z); } } } return 0; }

__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/17776984.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示