线段树*5
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 5 using namespace std; 6 const int N=10001; 7 8 struct node{ 9 int l,r,w,f; 10 }T[N]; 11 12 int ans,ans1,n,m,z,x,y,yj; 13 14 inline void Heart(int jd) 15 { 16 T[jd].w=T[jd<<1].w+T[jd<<1|1].w; 17 } 18 19 inline void down(int jd) 20 { 21 T[jd<<1].w+=T[jd].f*(T[jd<<1].r-T[jd<<1].l+1); 22 T[jd<<1|1].w+=T[jd].f*(T[jd<<1|1].r-T[jd<<1|1].l+1); 23 T[jd<<1].f+=T[jd].f; 24 T[jd<<1|1].f+=T[jd].f; 25 T[jd].f=0; 26 } 27 28 inline void build(int l,int r,int jd) 29 { 30 T[jd].l=l; 31 T[jd].r=r; 32 if(T[jd].l==T[jd].r) {scanf("%d",&T[jd].w); return ;} 33 int mid=(l+r)>>1; 34 build(l,mid,jd<<1); 35 build(mid+1,r,jd<<1|1); 36 Heart(jd); 37 } 38 39 inline void po_ask(int jd) 40 { 41 if(T[jd].l==T[jd].r){ ans=T[jd].w; return ;} 42 if(T[jd].f)down(jd); 43 int mid=(T[jd].l+T[jd].r)>>1; 44 if(x<=mid)po_ask(jd<<1); 45 else po_ask(jd<<1|1); 46 } 47 48 inline void po_mod(int jd) 49 { 50 if(T[jd].l==T[jd].r){T[jd].w=y;return ;} 51 int mid=(T[jd].l+T[jd].r)>>1; 52 if(T[jd].l<=mid)po_mod(jd<<1); 53 else po_mod(jd<<1|1); 54 Heart(jd); 55 } 56 57 inline void qj_ask(int jd) 58 { 59 if(x<=T[jd].l&&T[jd].r<=y){ans1+=T[jd].w;return ;} 60 if(T[jd].f)down(jd); 61 int mid=(T[jd].l+T[jd].r)>>1; 62 if(x<=mid)qj_ask(jd<<1); 63 if(y>mid)qj_ask(jd<<1|1); 64 } 65 66 inline void qj_mod(int jd) 67 { 68 if(x<=T[jd].l&&T[jd].r<=y){T[jd].w+=(T[jd].l-T[jd].r+1)*yj;T[jd].f+=yj;return ;} 69 if(T[jd].f)down(jd); 70 int mid=(T[jd].l+T[jd].r)>>1; 71 if(x<=mid)qj_mod(jd<<1); 72 if(y>mid)qj_mod(jd<<1|1); 73 Heart(jd); 74 } 75 76 int main() 77 { 78 scanf("%d",&n); 79 build(1,n,1); 80 scanf("%d",&m); 81 for(int i=1;i<=m;i++) 82 { 83 scanf("%d",&z); 84 ans=0;ans1=0; 85 if(z==1) {scanf("%d",&x); po_ask(1); printf("%d\n",ans);} 86 if(z==2) {scanf("%d%d",&x,&y); po_mod(1);} 87 if(z==3) {scanf("%d%d",&x,&y); qj_ask(1); printf("%d\n",ans);} 88 if(z==4) {scanf("%d%d%d",&x,&y,&yj); qj_mod(1);} 89 } 90 return 0; 91 }
读入优化
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 5 using namespace std; 6 const int N=10001; 7 8 struct node{ 9 int l,r,w,f; 10 }T[N]; 11 12 int ans,ans1,n,m,z,x,y,yj; 13 14 inline void read(int &x) 15 { 16 char c=getchar();x=0; 17 while(c<'0'||c>'9')c=getchar(); 18 while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); 19 } 20 21 inline void Heart(int jd) 22 { 23 T[jd].w=T[jd<<1].w+T[jd<<1|1].w; 24 } 25 26 inline void down(int jd) 27 { 28 T[jd<<1].w+=T[jd].f*(T[jd<<1].r-T[jd<<1].l+1); 29 T[jd<<1|1].w+=T[jd].f*(T[jd<<1|1].r-T[jd<<1|1].l+1); 30 T[jd<<1].f+=T[jd].f; 31 T[jd<<1|1].f+=T[jd].f; 32 T[jd].f=0; 33 } 34 35 inline void build(int l,int r,int jd) 36 { 37 T[jd].l=l; 38 T[jd].r=r; 39 if(T[jd].l==T[jd].r) {read(T[jd].w); return ;} 40 int mid=(l+r)>>1; 41 build(l,mid,jd<<1); 42 build(mid+1,r,jd<<1|1); 43 Heart(jd); 44 } 45 46 inline void po_ask(int jd) 47 { 48 if(T[jd].l==T[jd].r){ ans=T[jd].w; return ;} 49 if(T[jd].f)down(jd); 50 int mid=(T[jd].l+T[jd].r)>>1; 51 if(x<=mid)po_ask(jd<<1); 52 else po_ask(jd<<1|1); 53 } 54 55 inline void po_mod(int jd) 56 { 57 if(T[jd].l==T[jd].r){T[jd].w=y;return ;} 58 int mid=(T[jd].l+T[jd].r)>>1; 59 if(T[jd].l<=mid)po_mod(jd<<1); 60 else po_mod(jd<<1|1); 61 Heart(jd); 62 } 63 64 inline void qj_ask(int jd) 65 { 66 if(x<=T[jd].l&&T[jd].r<=y){ans1+=T[jd].w;return ;} 67 if(T[jd].f)down(jd); 68 int mid=(T[jd].l+T[jd].r)>>1; 69 if(x<=mid)qj_ask(jd<<1); 70 if(y>mid)qj_ask(jd<<1|1); 71 } 72 73 inline void qj_mod(int jd) 74 { 75 if(x<=T[jd].l&&T[jd].r<=y){T[jd].w+=(T[jd].l-T[jd].r+1)*yj;T[jd].f+=yj;return ;} 76 if(T[jd].f)down(jd); 77 int mid=(T[jd].l+T[jd].r)>>1; 78 if(x<=mid)qj_mod(jd<<1); 79 if(y>mid)qj_mod(jd<<1|1); 80 Heart(jd); 81 } 82 83 int main() 84 { 85 read(n); 86 build(1,n,1); 87 read(m); 88 for(int i=1;i<=m;i++) 89 { 90 read(z); 91 ans=0;ans1=0; 92 if(z==1) {read(x); po_ask(1); printf("%d\n",ans);} 93 if(z==2) {read(x);read(y); po_mod(1);} 94 if(z==3) {read(x);read(y); qj_ask(1); printf("%d\n",ans);} 95 if(z==4) {read(x);read(y);read(yj); qj_mod(1);} 96 } 97 return 0; 98 }