zoukankan      html  css  js  c++  java
  • 线段树模板

     

    区间修改,区间查询,求和

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 using namespace std;
     6 const int maxn = 1e6+6;
     7 #define LL long long
     8 #define INF 0x7fffffff
     9 
    10 int n,q,a[maxn];
    11 
    12 struct node{
    13     int l, r;
    14     LL sum, lazy;
    15     void update(int x) {
    16         sum += 1LL*(r-l+1)*x; // 防止爆int
    17         lazy += x;
    18     }
    19 }tree[maxn*4];
    20 
    21 void push_up(int x) {
    22     tree[x].sum = tree[x<<1].sum + tree[x<<1|1].sum;
    23 }
    24 
    25 void push_down(int x) {
    26     int lazy = tree[x].lazy;
    27     if(lazy) {
    28         tree[x<<1].update(lazy);
    29         tree[x<<1|1].update(lazy);
    30         tree[x].lazy = 0;
    31     }
    32 }
    33 
    34 void build(int x, int l, int r) {
    35     tree[x].l = l, tree[x].r = r;
    36     tree[x].sum = tree[x].lazy = 0;
    37     if(l == r) {
    38         tree[x].sum = a[l];
    39     }
    40     else {
    41         int mid = (l+r) / 2;
    42         build(x<<1, l, mid);
    43         build(x<<1|1, mid+1, r);
    44         push_up(x);
    45     }
    46 }
    47 
    48 void update(int x, int l, int r, int val) {
    49     int L = tree[x].l, R = tree[x].r;
    50     if(l <= L && R <= r) {
    51         tree[x].update(val);
    52     }
    53     else {
    54         push_down(x);
    55         int mid = (L+R) / 2;
    56         if(mid >= l) update(x<<1, l, r, val);
    57         if(r > mid) update(x<<1|1, l, r, val);
    58         push_up(x);
    59     }
    60 }
    61 
    62 LL query(int x, int l, int r) {
    63     int L = tree[x].l, R = tree[x].r;
    64     if(l <= L && R <= r) return tree[x].sum;
    65     else {
    66         push_down(x);
    67         int mid = (L+R) / 2;
    68         LL ans = 0;
    69         if(mid >= l) ans += query(x<<1, l, r);
    70         if(r > mid) ans += query(x<<1|1, l, r);
    71         push_up(x);
    72         return ans;
    73     }
    74 }
    75 
    76 
    77 int main() {
    78     scanf("%d",&n);
    79     for(int i=1;i<=n;i++)a[i]=0;
    80     build(1,1,n);
    81     scanf("%d",&q);
    82     for(int i=1;i<=q;i++)
    83     {
    84         int o,l,r,val;
    85         scanf("%d%d%d%d",&o,&l,&r,&val);
    86         if(o==0)update(1,l,r,val);
    87         else printf("%lld
    ",query(1,l,r));
    88     }
    89     return 0;
    90 }
  • 相关阅读:
    大型网站架构
    Swift 2.x 升为 swift 3后语法不兼容问题适配
    Redis开发
    你必须知道的Dockerfile
    JAVA知识点汇总
    JAVA知识点汇总
    nginx location配置详细解释
    python3 urllib.request.Request的用法
    拉勾网python开发要求爬虫
    爬虫工程师是干什么的?你真的知道了吗?
  • 原文地址:https://www.cnblogs.com/demian/p/8995330.html
Copyright © 2011-2022 走看看