zoukankan      html  css  js  c++  java
  • *模板--数据结构

    非递归线段树(未测试)

     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 };
    View Code
  • 相关阅读:
    fopen和open的区别
    vc代码缩进
    防止u盘中autorun的一个小方法
    判断单链表是否有环
    四色原理
    Log4j的使用
    Ant学习笔记
    关于Oracle Exp00003问题的解决方法
    装机小记
    用iframe做编辑器
  • 原文地址:https://www.cnblogs.com/yijiull/p/7288463.html
Copyright © 2011-2022 走看看