线段树成段更新 poj 3468 A Simple Problem with Integers

 poj  3468  A Simple Problem with Integers

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

题目大意:给出n个数,A1,A2,.....An,给出q个操作,

C a b c     表示第a个数到第b个数都加上c

Q a b        表示询问第a个数到第b个数的和

线段树成段更新:update:成段增减  query:区间求和

                       pushup:把当前结点的信息更新到父结点

                       pushdown:把当前结点的信息更新给儿子结点

注意:用到int64

代码如下:

 1 #include<stdio.h>

 2 #define lson l,m,rt<<1

 3 #define rson m+1,r,rt<<1|1

 4 #define N 100010

 5 __int64 tree[N<<2],add[N<<2];

 6 void pushup(int rt)

 7 {

 8     tree[rt]=tree[rt<<1]+tree[rt<<1|1];

 9 }

10 void pushdown(int rt,int m)

11 {

12     if(add[rt])

13     {

14         add[rt<<1]+=add[rt];

15         add[rt<<1|1]+=add[rt];

16         tree[rt<<1]+=add[rt]*(m-(m>>1));

17         tree[rt<<1|1]+=add[rt]*(m>>1);

18         add[rt]=0;

19     }

20 }

21 void build(int l,int r,int rt)

22 {

23     add[rt]=0;

24     if(l==r)

25     {

26         scanf("%I64d",&tree[rt]);

27         return ;

28     }

29     int m=(l+r)>>1;

30     build(lson);

31     build(rson);

32     pushup(rt);

33 }

34 void update(int L,int R,int c,int l,int r,int rt)

35 {

36     if(L<=l&&R>=r)

37     {

38         add[rt]+=c;

39         tree[rt]+=c*(r-l+1);

40         return ;

41     }

42     pushdown(rt,r-l+1);

43     int m=(l+r)>>1;

44     if(L<=m)

45         update(L,R,c,lson);

46     if(R>m)

47         update(L,R,c,rson);

48     pushup(rt);

49 }

50 __int64 query(int L,int R,int l,int r,int rt)

51 {

52     if(L<=l&&R>=r)

53         return tree[rt];

54     pushdown(rt,r-l+1);

55     int m=(l+r)>>1;

56     __int64 ret=0;

57     if(L<=m)

58         ret+=query(L,R,lson);

59     if(R>m)

60         ret+=query(L,R,rson);

61     return ret;

62 }

63 int main()

64 {

65     int n,q,a,b,c;

66     char s[2];

67     scanf("%d%d",&n,&q);

68     build(1,n,1);

69     while(q--)

70     {

71         scanf("%s",s);

72         if(s[0]=='Q')

73         {

74             scanf("%d%d",&a,&b);

75             printf("%I64d\n",query(a,b,1,n,1));

76         }

77         else

78         {

79             scanf("%d%d%d",&a,&b,&c);

80             update(a,b,c,1,n,1);

81         }

82     }

83     return 0;

84 }
View Code

 

 

你可能感兴趣的:(Integer)