bzoj3212: Pku3468 A Simple Problem with Integers(线段树)

3212: Pku3468 A Simple Problem with Integers

题目:传送门 

 


 

 

题解:

   感谢Rose_max大佬的倾情相(推)助(水题)

   一起打线段树啊~~~~

 


 

 

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 typedef long long LL;
 8 struct node
 9 {
10     int l,r,lc,rc;
11     LL lazy,c;bool v;
12 }tr[410000];int trlen;
13 void update(int now)
14 {
15     int lc=tr[now].lc,rc=tr[now].rc;
16     tr[lc].c+=tr[now].lazy*(tr[lc].r-tr[lc].l+1);tr[lc].lazy+=tr[now].lazy;tr[lc].v=true;
17     tr[rc].c+=tr[now].lazy*(tr[rc].r-tr[rc].l+1);tr[rc].lazy+=tr[now].lazy;tr[rc].v=true;
18     tr[now].lazy=0;tr[now].v=false;
19 }
20 void bt(int l,int r)
21 {
22     int now=++trlen;
23     tr[now].l=l;tr[now].r=r;tr[now].c=0;
24     tr[now].lc=tr[now].rc=-1;tr[now].lazy=0;tr[now].v=false;
25     if(l<r)
26     {
27         int mid=(l+r)/2;
28         tr[now].lc=trlen+1;bt(l,mid);
29         tr[now].rc=trlen+1;bt(mid+1,r);
30     }
31 }
32 void add(int now,int l,int r,int c)
33 {
34     if(tr[now].l==l && r==tr[now].r){tr[now].c+=LL(c)*(tr[now].r-tr[now].l+1);tr[now].lazy+=c;tr[now].v=true;return ;}
35     int lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/2;
36     if(tr[now].v)update(now);
37     if(r<=mid)add(lc,l,r,c);
38     else if(mid+1<=l)add(rc,l,r,c);
39     else add(lc,l,mid,c),add(rc,mid+1,r,c);
40     tr[now].c=(tr[lc].c+tr[rc].c);
41 }
42 LL getsum(int now,int l,int r)
43 {
44     if(tr[now].l==l && r==tr[now].r)return tr[now].c;
45     int lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/2;
46     if(tr[now].v)update(now);
47     if(r<=mid)return getsum(lc,l,r);
48     else if(mid+1<=l)return getsum(rc,l,r);
49     else return getsum(lc,l,mid)+getsum(rc,mid+1,r);
50 }
51 int main()
52 {
53     int n,m,x,y;
54     scanf("%d%d",&n,&m);bt(1,n);for(int i=1;i<=n;i++)scanf("%d",&x),add(1,i,i,x);
55     while(m--)
56     {
57         char s[5];
58         scanf("%s%d%d",s+1,&x,&y);if(x>y)swap(x,y);
59         if(s[1]=='C'){LL c;scanf("%lld",&c);add(1,x,y,c);}
60         else printf("%lld\n",getsum(1,x,y));
61     }
62     return 0;
63 }

 

posted @ 2018-03-24 10:37  CHerish_OI  阅读(144)  评论(0编辑  收藏  举报