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