zoukankan      html  css  js  c++  java
  • 主席树(可持久化线段树版)

    求区间和模板

     1 struct node{
     2     int l[maxn*20],r[maxn*20];  //区间大小    maxn = 1e5时为20倍,不够就开40
     3     int li[maxn*20],ri[maxn*20];//左孩子和右孩子的位置
     4     int sum[maxn*20],add[maxn*20]; //区间和,懒惰标记
     5     int tot;///数组大小,使用的时候先初始化为0
     6 
     7     void init(int x,int y){
     8         li[x] = li[y];  l[x] = l[y];
     9         ri[x] = ri[y];  r[x] = r[y];
    10         sum[x] = sum[y]; add[x] = add[y];
    11     }
    12 
    13     void build(int &pos,int L,int R){//建树,也可以建一个空树
    14         pos = ++tot;
    15         sum[pos] = 0;
    16         l[pos] = L;
    17         r[pos] = R;
    18         add[pos] = 0;
    19         if(L == R){
    20             scanf("%intd",&sum[pos]);
    21             return;
    22         }
    23         int mid = (L+R)>>1;
    24         build(li[pos],L,mid);
    25         build(ri[pos],mid+1,R);
    26         sum[pos] = sum[li[pos]] + sum[ri[pos]];
    27     }
    28 
    29     void update(int L,int R,int &x,int y,int k){//区间修改,x传入低k棵线段树的根节点,y为第k-1棵线段树的根节点
    30         x = ++tot;
    31         init(x,y);
    32         if(L == l[x] && R == r[x]){
    33             sum[x] += (R-L+1)*k;
    34             add[x] += k;
    35             return;
    36         }
    37         sum[x] += (R - L + 1)*k;
    38         int mid = (l[x]+r[x])>>1;
    39         if(R <= mid){
    40             update(L,R,li[x],li[y],k);
    41         }
    42         else if(L > mid){
    43             update(L,R,ri[x],ri[y],k);
    44         }
    45         else{
    46             update(L,mid,li[x],li[y],k);
    47             update(mid+1,R,ri[x],ri[y],k);
    48         }
    49     }
    50 
    51     int query(int L,int R,int pos,int add1){//查询第根节点为pos的树的l,r和,add1为父亲节点的add累加和,初始传入0
    52         if(L == l[pos] && R == r[pos]){
    53             return sum[pos] + add1*(R-L+1);
    54         }
    55         int mid = (l[pos]+r[pos])/2;
    56         if(R <= mid){
    57             return query(L,R,li[pos],add[pos]+add1);
    58         }
    59         else if(L > mid){
    60             return query(L,R,ri[pos],add[pos]+add1);
    61         }
    62         else{
    63             return query(L,mid,li[pos],add[pos]+add1)+query(mid+1,R,ri[pos],add[pos]+add1);
    64         }
    65     }
    66 }tre;

     上面那个有点挫,补一个常数小一点的

     1 int l[maxn*40],r[maxn*40],sum[maxn*40];
     2 int mark[maxn],a[maxn],ans[maxn],root[maxn];
     3 int tot;
     4 
     5 void build(int &x,int s,int t){
     6     x = ++tot;
     7     sum[x] = 0;
     8     if(s == t) return;
     9     int mid = (s+t) >> 1;
    10     build(l[x],s,mid);
    11     build(r[x],mid+1,t);
    12 }
    13 
    14 void update(int &x,int y,int s,int t,int k,int v){
    15     x = ++tot;
    16     l[x] = l[y];
    17     r[x] = r[y];
    18     sum[x] = sum[y] + v;
    19     if(s == t) return;
    20     int mid = (s + t) >> 1;
    21     if(k <= mid) update(l[x],l[y],s,mid,k,v);
    22     else update(r[x],r[y],mid+1,t,k,v);
    23 }
    24 
    25 int query(int s,int t,int ll,int rr,int x){
    26     if(s <= ll && rr <= t) return sum[x];
    27     int mid = (ll + rr) >> 1;
    28     int res = 0;
    29     if(s <= mid) res += query(s,t,ll,mid,l[x]);
    30     if(t > mid) res += query(s,t,mid+1,rr,r[x]);
    31     return res;
    32 }
  • 相关阅读:
    Flash请求不能传Cookie的PHP解决方案
    免费与不免费
    js编码之 encodeURIComponent
    锁定老帖子 主题:你应当了解的几个CSS3新技术
    清除浮动mini版
    iPad网页开发教程及规则
    手持设备meta设置
    使用 jQuery 在新窗口打开外部链接
    jQuery GET POST AJAX與php异步加载
    游戏英文词汇命名——备用
  • 原文地址:https://www.cnblogs.com/yZiii/p/7295459.html
Copyright © 2011-2022 走看看