• 【算法系列学习】线段树 区间修改,区间求和 [kuangbin带你飞]专题七 线段树 C


    https://vjudge.net/contest/66989#problem/C

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<string>
      5 #include<algorithm>
      6 #include<cmath>
      7 #define lson (i<<1)
      8 #define rson (i<<1|1)
      9 typedef long long ll;
     10 using namespace std;
     11 const int maxn=1e5+5;
     12 ll val[maxn];
     13 
     14 struct Seg
     15 {
     16     int l,r;
     17     ll lazy,val;
     18 }tree[maxn<<2];
     19 
     20 void push_up(int i)
     21 {
     22     tree[i].val=tree[lson].val+tree[rson].val;
     23 }
     24 
     25 void push_down(int i)
     26 {
     27     if(tree[i].lazy==0)
     28     {
     29         return;
     30     }
     31     tree[lson].lazy+=tree[i].lazy;
     32     tree[lson].val+=tree[i].lazy*(tree[lson].r-tree[lson].l+1);
     33     tree[rson].lazy+=tree[i].lazy;
     34     tree[rson].val+=tree[i].lazy*(tree[rson].r-tree[rson].l+1);
     35     tree[i].lazy=0;
     36 }
     37 
     38 void Build(int l,int r,int i=1)
     39 {
     40     tree[i].l=l;
     41     tree[i].r=r;
     42     tree[i].lazy=0;
     43     if(l==r)
     44     {
     45         tree[i].val=val[l];
     46         return;
     47     }
     48 //    push_down(i);
     49     int mid=(tree[i].l+tree[i].r)>>1;
     50     Build(l,mid,lson);
     51     Build(mid+1,r,rson);
     52     push_up(i);
     53 }
     54 
     55 ll Query(int l,int r,int i=1)
     56 {
     57     if(tree[i].l==l&&tree[i].r==r)
     58     {
     59         return tree[i].val;
     60     }
     61     push_down(i);
     62     int mid=(tree[i].l+tree[i].r)>>1;
     63     if(r<=mid)
     64     {
     65         return Query(l,r,lson);
     66     }
     67     else if(l>mid)
     68     {
     69         return Query(l,r,rson);
     70     }
     71     else
     72     {
     73         return Query(l,mid,lson)+Query(mid+1,r,rson);
     74     }
     75 }
     76 
     77 void Add(int l,int r,ll x,int i=1)
     78 {
     79     if(tree[i].l==l&&tree[i].r==r)
     80     {
     81         tree[i].lazy+=x;
     82         tree[i].val+=x*(ll)(r-l+1);
     83         return;
     84     }
     85     push_down(i);
     86     int mid=(tree[i].l+tree[i].r)>>1;
     87     if(r<=mid)
     88     {
     89         Add(l,r,x,lson);
     90     }
     91     else if(l>mid)
     92     {
     93         Add(l,r,x,rson); 
     94     }
     95     else
     96     {
     97         Add(l,mid,x,lson);
     98         Add(mid+1,r,x,rson);
     99     }
    100     push_up(i);
    101  } 
    102 
    103 int main()
    104 {
    105     int n,m;
    106     while(~scanf("%d%d",&n,&m))
    107     {
    108         for(int i=1;i<=n;i++)
    109         {
    110             scanf("%lld",&val[i]);
    111         }
    112         Build(1,n);
    113         char q[20];
    114         int a,b,c;
    115         for(int i=1;i<=m;i++)
    116         {
    117             scanf("%s%d%d",q,&a,&b);
    118             if(q[0]=='Q')
    119             {
    120                 printf("%lld
    ",Query(a,b));
    121             }
    122             else
    123             {
    124                 scanf("%d",&c);
    125                 Add(a,b,c);
    126             }
    127         }
    128     }
    129     return 0;
    130  } 
    View Code
  • 相关阅读:
    四大组件之BroadcastReceiver基础
    SQLiteOpenHelper与SQLiteDatabase的使用
    SharedPreferences实现保存用户名功能
    Fragment加载方式与数据通信
    ProgressBar、ProgessDialog用法解析
    GridView添加事件监听和常用属性解析
    ListView添加item的事件监听
    ArrayAdapter、SimpleAdapter简单用法
    MySQL入门笔记(二)
    MySQL入门笔记(一)
  • 原文地址:https://www.cnblogs.com/itcsl/p/6672524.html
Copyright © 2020-2023  润新知