zoukankan      html  css  js  c++  java
  • 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
    ",getsum(1,x,y));
    61     }
    62     return 0;
    63 }
  • 相关阅读:
    Machine learning 第8周编程作业 K-means and PCA
    Machine learning 第7周编程作业 SVM
    Machine learning第6周编程作业
    Machine learning 第5周编程作业
    小M的作物 最小割最大流
    k-近邻算法 python实现
    编辑距离 区间dp
    Machine learning第四周code 编程作业
    MDK5报错missing closing quote
    HDU 5512
  • 原文地址:https://www.cnblogs.com/CHerish_OI/p/8637871.html
Copyright © 2011-2022 走看看