zoukankan      html  css  js  c++  java
  • 可持久化线段树 支持懒惰标记

    懒惰标记下放版本(费内存)FJUTOJ 2507   这个代码过不去   内存不够用

      1 #include<stdio.h>
      2 const int N=1e5+2;
      3 
      4 struct long_time_Segment_tree
      5 {
      6     struct node
      7     {
      8         long long val,lazy;
      9         int son[2],Size;
     10         void init()
     11         {
     12             val=lazy=son[0]=son[1]=0;
     13         }
     14     } T[N*40];
     15     int cnt;
     16 
     17     void update(int pos)
     18     {
     19         if(T[pos].Size==1)return ;
     20         T[pos].val=T[T[pos].son[0]].val+T[T[pos].son[1]].val;
     21         if(T[T[pos].son[0]].lazy)
     22         {
     23             T[pos].val+=T[T[pos].son[0]].lazy*T[T[pos].son[0]].Size;
     24         }
     25         if(T[T[pos].son[1]].lazy)
     26         {
     27             T[pos].val+=T[T[pos].son[1]].lazy*T[T[pos].son[1]].Size;
     28         }
     29     }
     30 
     31     void pushdown(int pos)
     32     {
     33         if(pos==0)return ;
     34         if(T[pos].lazy)
     35         {
     36             if(T[pos].son[0])
     37             {
     38                 int x=++cnt;
     39                 T[x]=T[T[pos].son[0]];
     40                 T[pos].son[0]=x;
     41                 if(T[x].Size==1)
     42                     T[x].val+=T[pos].lazy;
     43                 else
     44                 T[x].lazy+=T[pos].lazy;
     45             }
     46             if(T[pos].son[1])
     47             {
     48                 int x=++cnt;
     49                 T[x]=T[T[pos].son[1]];
     50                 T[pos].son[1]=x;
     51                 if(T[x].Size==1)
     52                     T[x].val+=T[pos].lazy;
     53                 else
     54                 T[x].lazy+=T[pos].lazy;
     55             }
     56             T[pos].lazy=0;
     57         }
     58     }
     59 
     60     int build(int l,int r,long long *a)
     61     {
     62         int pos=++cnt;
     63         T[pos].init();
     64         T[pos].Size=r-l+1;
     65         if(l==r)
     66         {
     67             T[pos].val=a[l];
     68             return pos;
     69         }
     70         int mid=(l+r)>>1;
     71         T[pos].son[0]=build(l,mid,a);
     72         T[pos].son[1]=build(mid+1,r,a);
     73         update(pos);
     74         return pos;
     75     }
     76 
     77     void add(int L,int R,int l,int r,long long v,int &x,int y)
     78     {
     79         x=++cnt;
     80         T[x]=T[y];
     81         if(L==l&&R==r)
     82         {
     83             if(l==r)
     84                 T[x].val+=v;
     85             else
     86                 T[x].lazy+=v;
     87             return ;
     88         }
     89         int mid=(L+R)>>1;
     90         if(r<=mid)
     91             add(L,mid,l,r,v,T[x].son[0],T[y].son[0]);
     92         else if(l>mid)
     93             add(mid+1,R,l,r,v,T[x].son[1],T[y].son[1]);
     94         else
     95         {
     96             add(L,mid,l,mid,v,T[x].son[0],T[y].son[0]);
     97             add(mid+1,R,mid+1,r,v,T[x].son[1],T[y].son[1]);
     98         }
     99         update(x);
    100     }
    101 
    102     long long query(int L,int R,int l,int r,int pos)
    103     {
    104         pushdown(pos);
    105         update(pos);
    106         if(L==l&&R==r)
    107         {
    108             return T[pos].val;
    109         }
    110         int mid=(L+R)>>1;
    111         if(r<=mid)
    112             return query(L,mid,l,r,T[pos].son[0]);
    113         else if(l>mid)
    114             return query(mid+1,R,l,r,T[pos].son[1]);
    115         else
    116             return query(L,mid,l,mid,T[pos].son[0])+query(mid+1,R,mid+1,r,T[pos].son[1]);
    117     }
    118 
    119 }tree;
    120 
    121 int root[N];
    122 
    123 long long a[N];
    124 
    125 char op[5];
    126 
    127 int main()
    128 {
    129     //freopen("input.txt","r",stdin);
    130     //freopen("output1.txt","w",stdout);
    131     int n,r=1;
    132     while(~scanf("%d",&n))
    133     {
    134         tree.cnt=0;
    135         printf("Case %d:
    ",r++);
    136         for(int i=1;i<=n;i++)
    137             scanf("%lld",a+i);
    138         int m;
    139         scanf("%d",&m);
    140         root[0]=tree.build(1,n,a);
    141         long long x,y,z,now=0;
    142         while(m--)
    143         {
    144             scanf("%s",op);
    145             if(op[0]=='A')
    146             {
    147                 scanf("%lld%lld%lld",&x,&y,&z);
    148                 tree.add(1,n,x,y,z,root[now+1],root[now]);
    149                 now++;
    150             }
    151             else if(op[0]=='B')
    152             {
    153                 scanf("%lld%lld%lld",&z,&x,&y);
    154                 printf("%lld
    ",tree.query(1,n,x,y,root[z]));
    155             }
    156             else if(op[0]=='C')
    157             {
    158                 scanf("%lld",&x);
    159                 now=x;
    160             }
    161         }
    162     }
    163     return 0;
    164 }

    懒惰标记不下放版本(内存少跑得快)

      1 #include<stdio.h>
      2 const int N=1e5+2;
      3 
      4 struct long_time_Segment_tree
      5 {
      6     struct node
      7     {
      8         long long val,lazy;
      9         int son[2],Size;
     10         void init()
     11         {
     12             val=lazy=son[0]=son[1]=0;
     13         }
     14     } T[N*20];
     15     int cnt;
     16 
     17     int build(int l,int r,long long *a)
     18     {
     19         int pos=++cnt;
     20         T[pos].init();
     21         T[pos].Size=r-l+1;
     22         if(l==r)
     23         {
     24             T[pos].val=a[l];
     25             return pos;
     26         }
     27         int mid=(l+r)>>1;
     28         T[pos].son[0]=build(l,mid,a);
     29         T[pos].son[1]=build(mid+1,r,a);
     30         T[pos].val=T[T[pos].son[0]].val+T[T[pos].son[1]].val;
     31         T[pos].Size=T[T[pos].son[0]].Size+T[T[pos].son[1]].Size;
     32         return pos;
     33     }
     34 
     35     void add(int L,int R,int l,int r,long long v,int &x,int y)
     36     {
     37         x=++cnt;
     38         T[x]=T[y];
     39         T[x].val+=v*(r-l+1);
     40         if(L==l&&R==r)
     41         {
     42             T[x].lazy+=v;
     43             return ;
     44         }
     45         int mid=(L+R)>>1;
     46         if(r<=mid)
     47             add(L,mid,l,r,v,T[x].son[0],T[y].son[0]);
     48         else if(l>mid)
     49             add(mid+1,R,l,r,v,T[x].son[1],T[y].son[1]);
     50         else
     51         {
     52             add(L,mid,l,mid,v,T[x].son[0],T[y].son[0]);
     53             add(mid+1,R,mid+1,r,v,T[x].son[1],T[y].son[1]);
     54         }
     55     }
     56 
     57     long long query(int L,int R,int l,int r,int pos,long long sum=0)
     58     {
     59         if(L==l&&R==r)
     60         {
     61             return T[pos].val+sum*T[pos].Size;
     62         }
     63         sum+=T[pos].lazy;
     64         int mid=(L+R)>>1;
     65         if(r<=mid)
     66             return query(L,mid,l,r,T[pos].son[0],sum);
     67         else if(l>mid)
     68             return query(mid+1,R,l,r,T[pos].son[1],sum);
     69         else
     70             return query(L,mid,l,mid,T[pos].son[0],sum)+query(mid+1,R,mid+1,r,T[pos].son[1],sum);
     71     }
     72 
     73 }tree;
     74 
     75 int root[N];
     76 
     77 long long a[N];
     78 
     79 char op[5];
     80 
     81 int main()
     82 {
     83     //freopen("input.txt","r",stdin);
     84     //freopen("output1.txt","w",stdout);
     85     int n,r=1;
     86     while(~scanf("%d",&n))
     87     {
     88         tree.cnt=0;
     89         printf("Case %d:
    ",r++);
     90         for(int i=1;i<=n;i++)
     91             scanf("%lld",a+i);
     92         int m;
     93         scanf("%d",&m);
     94         root[0]=tree.build(1,n,a);
     95         long long x,y,z,now=0;
     96         while(m--)
     97         {
     98             scanf("%s",op);
     99             if(op[0]=='A')
    100             {
    101                 scanf("%lld%lld%lld",&x,&y,&z);
    102                 tree.add(1,n,x,y,z,root[now+1],root[now]);
    103                 now++;
    104             }
    105             else if(op[0]=='B')
    106             {
    107                 scanf("%lld%lld%lld",&z,&x,&y);
    108                 printf("%lld
    ",tree.query(1,n,x,y,root[z]));
    109             }
    110             else if(op[0]=='C')
    111             {
    112                 scanf("%lld",&x);
    113                 if(x!=now)
    114                 tree.cnt=root[x+1]+1;
    115                 now=x;
    116             }
    117         }
    118     }
    119     return 0;
    120 }
  • 相关阅读:
    关于iOS中页面启动加载的相关问题汇总
    文件上传与解析漏洞
    XSS跨站攻击
    SQL注入
    DOS&&Linux命令大全
    信息收集相关
    进制转化
    PYQT5 in Python
    将博客搬至CSDN
    Python报文操作模块scapy
  • 原文地址:https://www.cnblogs.com/xseventh/p/7323588.html
Copyright © 2011-2022 走看看