线段树的几种写法
创始人
2024-11-15 02:32:59
0

1.运用结构体

// 结构体版 #include  #include  #include  using namespace std;  #define N 100005 #define LL long long #define lc u<<1 #define rc u<<1|1 LL w[N]; struct Tree{ //线段树   LL l,r,sum,add; }tr[N*4];  void pushup(LL u){ //上传   tr[u].sum=tr[lc].sum+tr[rc].sum; } void pushdown(LL u){ //下传   if(tr[u].add){     tr[lc].sum+=tr[u].add*(tr[lc].r-tr[lc].l+1),     tr[rc].sum+=tr[u].add*(tr[rc].r-tr[rc].l+1),     tr[lc].add+=tr[u].add,     tr[rc].add+=tr[u].add,     tr[u].add=0;         } } void build(LL u,LL l,LL r){ //建树   tr[u]={l,r,w[l],0};   if(l==r) return;   LL m=l+r>>1;   build(lc,l,m);   build(rc,m+1,r);   pushup(u); } void change(LL u,LL l,LL r,LL k){ //区修   if(l<=tr[u].l&&tr[u].r<=r){     tr[u].sum+=(tr[u].r-tr[u].l+1)*k;     tr[u].add+=k;     return;   }   LL m=tr[u].l+tr[u].r>>1;   pushdown(u);   if(l<=m) change(lc,l,r,k);   if(r>m) change(rc,l,r,k);   pushup(u); } LL query(LL u,LL l,LL r){ //区查   if(l<=tr[u].l && tr[u].r<=r) return tr[u].sum;   LL m=tr[u].l+tr[u].r>>1;   pushdown(u);   LL sum=0;   if(l<=m) sum+=query(lc,l,r);   if(r>m) sum+=query(rc,l,r);   return sum; } int main(){   int n,m,op,x,y,k;     cin>>n>>m;   for(int i=1; i<=n; i ++) cin>>w[i];      build(1,1,n);   while(m--){     cin>>op>>x>>y;     if(op==2)cout<>k,change(1,x,y,k);   }   return 0; }

2.数组版

// 数组版 #include  #include  #include  using namespace std;  #define N 100005 #define LL long long #define lc u<<1 #define rc u<<1|1 LL w[N]; LL sum[N*4],add[N*4]; //区间和,懒标记  void pushup(LL u){   sum[u]=sum[lc]+sum[rc]; } void pushdown(LL u,LL l,LL r,LL mid){   if(add[u]){     sum[lc]+=add[u]*(mid-l+1);     sum[rc]+=add[u]*(r-mid);     add[lc]+=add[u];     add[rc]+=add[u];     add[u]=0;   } } void build(LL u,LL l,LL r){   sum[u]=w[l];   if(l==r) return;   LL mid=l+r>>1;   build(lc,l,mid);    build(rc,mid+1,r);   pushup(u); } void change(LL u,LL l,LL r,LL x,LL y,LL k){ //区修   if(x>r || y>1;   pushdown(u,l,r,mid);       change(lc,l,mid,x,y,k); //裂开   change(rc,mid+1,r,x,y,k);   pushup(u); } LL query(LL u,LL l,LL r,LL x,LL y){ //区查   if(x>r || y>1;   pushdown(u,l,r,mid);   return query(lc,l,mid,x,y)+query(rc,mid+1,r,x,y); } int main(){   int n,m,op,x,y,k;     cin>>n>>m;   for(int i=1; i<=n; i ++) cin>>w[i];      build(1,1,n);   while(m--){     cin>>op>>x>>y;     if(op==1) cin>>k,change(1,1,n,x,y,k);     else cout<

 

相关内容

热门资讯

此事备受玩家关注!新超圣辅助透... 此事备受玩家关注!新超圣辅助透视挂,建德麻将存在有挂,一贯有挂细节运新超圣辅助工具,进入游戏界面。进...
今天上午!熊猫麻将辅助透视挂,... 今天上午!熊猫麻将辅助透视挂,大唐撸麻雀确实有挂,确实有挂透视1、下载好大唐撸麻雀正确养号方法之后点...
突发!小吆三打哈辅助透视挂,悠... 突发!小吆三打哈辅助透视挂,悠闲麻将真的是有挂,原来有挂解密一、小吆三打哈游戏安装教程牌型概率发牌机...
今年以来!樱花梦雨辅助透视挂,... 今年以来!樱花梦雨辅助透视挂,新滕州麻将真的是有挂,好像有挂方法今年以来!樱花梦雨辅助透视挂,新滕州...
备受关注的!边锋老友棋牌辅助透... 备受关注的!边锋老友棋牌辅助透视挂,微友麻将是真的有挂,一直有挂攻略运边锋老友棋牌辅助工具,进入游戏...
明白辅助挂!萍乡滚筒辅助透视挂... 明白辅助挂!萍乡滚筒辅助透视挂,大唐麻将游戏是有挂,一直有挂教程1、操作简单,无需大唐麻将游戏手机版...
据报道!丫丫古诗辅助透视挂,琼... 据报道!丫丫古诗辅助透视挂,琼崖海南麻将真的有挂,其实有挂方法丫丫古诗脚本下载中分为三种模型:丫丫古...
随着!多多休闲辅助透视挂,东游... 随着!多多休闲辅助透视挂,东游麻将是真的有挂,竟然有挂存在随着!多多休闲辅助透视挂,东游麻将是真的有...
方法辅助挂!星禾游戏辅助透视挂... 方法辅助挂!星禾游戏辅助透视挂,太浪乾安麻将是真的有挂,果然发现有挂1、下载好星禾游戏脚本下载之后点...
近日!巅峰互娱辅助透视挂,趣咪... 近日!巅峰互娱辅助透视挂,趣咪麻将确实有挂,真是揭秘有挂;1、这是跨平台的巅峰互娱轻量版有透视,在线...