zoukankan      html  css  js  c++  java
  • P3372 【模板】线段树 1

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const ll N=1000010;
     5 ll n,m;
     6 ll a[N];
     7 
     8 struct Node{
     9     ll it;
    10     ll l;
    11     ll r;
    12     ll data;
    13 }tree[N];
    14 
    15 void build(ll rt,ll l,ll r){
    16     tree[rt].l=l;
    17     tree[rt].r=r;
    18     tree[rt].it=0;
    19     if(l==r){
    20         tree[rt].data=a[l];
    21         return ;
    22     }
    23     ll mid = (l+r)>>1;
    24     build(rt*2,l,mid);
    25     build(rt*2+1,mid+1,r);
    26     tree[rt].data=tree[rt*2].data+tree[rt*2+1].data;
    27     return ;
    28 }
    29 
    30 void push_down(ll rt){
    31     if(tree[rt].it!=0){
    32         tree[rt*2].it+=tree[rt].it;
    33         tree[rt*2+1].it+=tree[rt].it;
    34         ll mid = (tree[rt].l+tree[rt].r)>>1;
    35         tree[rt*2].data+=tree[rt].it*(mid-tree[rt*2].l+1);
    36         tree[rt*2+1].data+=tree[rt].it*(tree[rt*2+1].r-mid);
    37         tree[rt].it=0;
    38     }
    39     return ;
    40 }
    41 
    42 void up_data(ll rt,ll l,ll r,ll k){
    43     if(tree[rt].l>=l&&tree[rt].r<=r){
    44         tree[rt].data+=k*(tree[rt].r-tree[rt].l+1);
    45         tree[rt].it+=k;
    46         return ;
    47     }
    48     push_down(rt);
    49     if(tree[rt*2].r>=l){
    50         up_data(rt*2,l,r,k);
    51     }
    52     if(tree[rt*2+1].l<=r){
    53         up_data(rt*2+1,l,r,k);
    54     }
    55     tree[rt].data=tree[rt*2].data+tree[rt*2+1].data;
    56     return ;
    57 }
    58 
    59 ll search(ll rt,ll l,ll r){
    60     if(tree[rt].l>=l&&tree[rt].r<=r){
    61         return tree[rt].data;
    62     }
    63     push_down(rt);
    64     ll num=0;
    65     if(tree[rt*2].r>=l){
    66         num+=search(rt*2,l,r);
    67     }
    68     if(tree[rt*2+1].l<=r){
    69         num+=search(rt*2+1,l,r);
    70     }
    71     return num;
    72 }
    73 
    74 int main(){
    75     scanf("%lld%lld",&n,&m);
    76     for(ll i=1;i<=n;i++){
    77         scanf("%lld",&a[i]);
    78     }
    79     build(1,1,n);
    80     for(ll i=1;i<=m;i++){
    81         ll go;
    82         scanf("%lld",&go);
    83         if(go==1){
    84             ll a,b,c;
    85             scanf("%lld%lld%lld",&a,&b,&c);
    86             up_data(1,a,b,c);
    87         }
    88         if(go==2){
    89             ll a,b;
    90             scanf("%lld%lld",&a,&b);
    91             printf("%lld
    ",search(1,a,b));
    92         }
    93     }
    94     return 0;
    95 }
  • 相关阅读:
    POJ_2104_K-th Number_主席树
    BZOJ_1014_[JSOI2008]火星人prefix_splay+hash
    BZOJ_1861_[Zjoi2006]Book 书架_splay
    BZOJ_2242_[SDOI2011]计算器_快速幂+扩展GCD+BSGS
    BZOJ_3239_Discrete Logging_BSGS
    BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor
    BZOJ_1552_[Cerc2007]robotic sort_splay
    BZOJ_1500_[NOI2005]维修数列_splay
    BZOJ_1251_序列终结者
    吴裕雄--天生自然ORACLE数据库学习笔记:优化SQL语句
  • 原文地址:https://www.cnblogs.com/LightyaChoo/p/13198534.html
Copyright © 2011-2022 走看看