zoukankan      html  css  js  c++  java
  • 【板子】

    线段树

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<iostream>
     6 using namespace std;
     7 
     8 #define maxn 200000
     9 
    10 int n,m,fg,a,b;
    11 long long x;
    12 int num[maxn+5];
    13 
    14 struct tree{
    15     int l;
    16     int r;
    17     long long sum;
    18     int lazy;
    19 }t[maxn*4+5];
    20 
    21 void pushup(int u){
    22     t[u].sum=t[u<<1].sum+t[u<<1|1].sum;
    23 }
    24 
    25 void pushdown(int u){
    26     if(t[u].lazy){
    27         t[u<<1].lazy+=t[u].lazy;
    28         t[u<<1|1].lazy+=t[u].lazy;
    29         t[u<<1].sum+=(t[u<<1].r-t[u<<1].l+1)*t[u].lazy;
    30         t[u<<1|1].sum+=(t[u<<1|1].r-t[u<<1|1].l+1)*t[u].lazy;
    31         t[u].lazy=0;
    32     }
    33 }
    34 
    35 void build(int u,int l,int r){
    36     t[u].l=l;
    37     t[u].r=r;
    38     t[u].lazy=0;
    39     if(l==r){
    40         t[u].sum=num[l];
    41         return;
    42     }
    43     int mid=(l+r)>>1;
    44     build(u<<1,l,mid);
    45     build(u<<1|1,mid+1,r);
    46     pushup(u);
    47 }
    48 
    49 void update(int u,int l,int r,long long x){
    50     if(t[u].l>=l&&t[u].r<=r){
    51         t[u].lazy+=x;
    52         t[u].sum+=(t[u].r-t[u].l+1)*x;
    53         return;
    54     }
    55     pushdown(u);
    56     int mid=(t[u].l+t[u].r)>>1;
    57     if(l<=mid)update(u<<1,l,r,x);
    58     if(r>mid)update(u<<1|1,l,r,x);
    59     pushup(u);
    60 }
    61 
    62 long long query(int u,int l,int r){
    63     if(t[u].l>=l&&t[u].r<=r)return t[u].sum;
    64     pushdown(u);
    65     int mid=(t[u].l+t[u].r)>>1;
    66     long long ans=0;
    67     if(l<=mid)ans+=query(u<<1,l,r);
    68     if(r>mid)ans+=query(u<<1|1,l,r);
    69     return ans;
    70 }
    71 
    72 int main(){
    73     cin>>n;
    74     for(int i=1;i<=n;i++)
    75         cin>>num[i];
    76     build(1,1,n);
    77     cin>>m;
    78     for(int i=1;i<=m;i++){
    79         cin>>fg;
    80         if(fg==1){
    81             cin>>a>>b>>x;
    82             update(1,a,b,x);
    83         }
    84         else if(fg==2){
    85             cin>>a>>b;
    86             cout<<query(1,a,b)<<endl;
    87         }
    88     }
    89     return 0;
    90 }
    View Code
  • 相关阅读:
    HashTable、HashSet和Dictionary的区别
    CCF_ 201312-3_最大的矩形
    CCF_ 201312-2_ISBN号码
    CCF_201312-1_出现次数最多的数
    CCF_ 201509-2_日期计算
    CCF_ 201512-3_画图
    CCF_ 201512-2_消除类游戏
    CCF_ 201409-2_画图
    CCF_201409-1_相邻数对
    CCF_ 201412-1_门禁系统
  • 原文地址:https://www.cnblogs.com/chezhongyang/p/11584976.html
Copyright © 2011-2022 走看看