线段树 区域覆盖模版题 pku 3468 A Simple Problem with Integers 线段树——成段操作

题目连接:http://poj.org/problem?id=3468

题目大意:输入N,和Q,代表n个数字和q个操作,然后输入n个数字,然后再输入q个操作,Q代表求询问a,b编号之间的和(包含),C代表把a,b,之间的数都加上c。

代码:

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 #define maxn 100000*4+50
 4 struct node
 5 {
 6     __int64 num;
 7     __int64 lazy;//lazy标记
 8 }tr[maxn];
 9 __int64 count;
10 void pushup(__int64 rt)
11 {
12     tr[rt].num = tr[rt<<1].num+tr[rt<<1|1].num;
13 }
14 void build(__int64 l,__int64 r,__int64 rt)
15 {
16     if(l == r)//l r基本上就相当于编号~
17     {
18         scanf("%I64d",&tr[rt].num);
19         tr[rt].lazy = 0;//一定让他先为零
20         return;
21     }
22     __int64 m = (l+r)>>1;
23     build(l,m,rt<<1);
24     build(m+1,r,rt<<1|1);
25     pushup(rt);
26     return;
27 }
28 void pushdown(__int64 rt,__int64 len)
29 {
30     if(tr[rt].lazy)
31     {
32         tr[rt<<1].lazy += tr[rt].lazy;//一定要是+=哦,因为加法德查询区域为1,3的话,这个lazy标记到1,3就不走了,只有当它再次被询问的时候才往下走。。
33         tr[rt<<1|1].lazy += tr[rt].lazy;
34         tr[rt<<1].num += (len-(len>>1))*tr[rt].lazy;
35         tr[rt<<1|1].num += (len>>1)*tr[rt].lazy;
36         tr[rt].lazy = 0;
37     }
38     return;
39 }
40 void update(__int64 lx,__int64 rx,__int64 l,__int64 r,__int64 val,__int64 rt)
41 {
42     if(lx <= l && rx >= r)
43     {
44         tr[rt].num += val*(r-l+1);
45         tr[rt].lazy += val;
46         return;
47     }
48     pushdown(rt,r-l+1);
49      __int64 m = (l+r)>>1;
50     if(lx <= m)
51     update(lx,rx,l,m,val,rt<<1);
52     if(rx > m)
53     update(lx,rx,m+1,r,val,rt<<1|1);
54     pushup(rt);
55     return;
56 }
57 __int64 ask(__int64 lx,__int64 rx,__int64 l,__int64 r,__int64 rt)
58 {
59     __int64 sum;
60     sum  = 0;
61     if(lx <= l && rx >= r)
62     return tr[rt].num;
63 
64     pushdown(rt,r-l+1);//询问的时候把lazy往下延伸
65 
66     __int64 m = (l+r)>>1;
67     if(lx <= m)//区域不要搞错
68     sum+=ask(lx,rx,l,m,rt<<1);
69     if(rx > m)
70     sum+=ask(lx,rx,m+1,r,rt<<1|1);
71     return sum;
72 }
73 int main()
74 {
75     __int64 n,q,i,j,k;
76     scanf("%I64d %I64d",&n,&q);
77     char order[5];
78     build(1,n,1);
79     while(q--)
80     {
81         scanf("%s",order);
82         if(order[0] == 'Q')
83         {
84             __int64 x,y;
85             scanf("%I64d %I64d",&x,&y);;
86             printf("%I64d\n",ask(x,y,1,n,1));
87         }
88         else
89         {
90             __int64 x,y,val;
91             scanf("%I64d %I64d %I64d",&x,&y,&val);
92             update(x,y,1,n,val,1);
93         }
94     }
95     return 0;
96 }

 

posted @ 2012-08-12 15:06  某某。  阅读(164)  评论(0编辑  收藏  举报