• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
seventh成长中---
博客园    首页    新随笔    联系   管理    订阅  订阅
可持久化线段树 支持懒惰标记

懒惰标记下放版本(费内存)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:\n",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\n",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:\n",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\n",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 }

 

posted on 2017-08-09 09:46  xseventh  阅读(328)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3