线段树*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 }

 

posted @ 2017-05-11 15:33  ioioioioioio  阅读(185)  评论(0编辑  收藏  举报