• 线段树模板


     1 struct node
     2 {
     3     long long val;
     4     long long addmark;
     5 } ST[4*maxn+5];
     6 long long A[maxn];
     7 //修改求和还是维护区间最小值
     8 long long operation(long long a,long long b)
     9 {
    10     return a+b;
    11     //return max_min(a,b);
    12 }
    13 //修改求和还是维护区间最小值
    14 void change(int pos,long long addmark,int l)
    15 {
    16     ST[pos].val +=addmark*l;
    17 }
     1 void build(int root,int ibegin,int iend)
     2 {
     3     ST[root].addmark = 0;
     4     if (ibegin==iend)
     5         ST[root].val = A[ibegin];
     6     else
     7     {
     8         int mid = (ibegin+iend)/2;
     9         build(2*root,ibegin,mid);
    10         build(2*root+1,mid+1,iend);
    11         ST[root].val = operation(ST[root*2].val,ST[root*2+1].val);
    12     }
    13 }
     1 void push_down(int root,int l)
     2 {
     3     if (ST[root].addmark == 0) return;
     4     long long addmark = ST[root].addmark;
     5     ST[root*2].addmark+=addmark;
     6     ST[root*2+1].addmark+=addmark;
     7     change(root*2,addmark,l-l/2);
     8     change(root*2+1,addmark,l/2);
     9     ST[root].addmark = 0;
    10 }
     1 long long query(int root,int ibegin,int iend,int qbegin,int qend)
     2 {
     3     if (ibegin > qend || iend < qbegin)
     4         return 0;//
     5     if (ibegin>=qbegin&&iend<=qend)
     6         return ST[root].val;
     7     push_down(root,iend-ibegin+1);
     8     int mid = (ibegin+iend)/2;
     9     return operation(query(root*2,ibegin,mid,qbegin,qend),query(root*2+1,mid+1,iend,qbegin,qend));
    10 }
     1 void updata(int root,int ibegin,int iend,int qbegin,int qend,long long addmark)
     2 {
     3     if (ibegin > qend || iend < qbegin)
     4         return ;//
     5     if (ibegin>=qbegin&&iend<=qend)
     6         {
     7             ST[root].addmark+=addmark;
     8             change(root,addmark,iend-ibegin+1);
     9             return;
    10         }
    11     push_down(root,iend-ibegin+1);
    12     int mid = (ibegin+iend)/2;
    13     updata(root*2,ibegin,mid,qbegin,qend,addmark);
    14     updata(root*2+1,mid+1,iend,qbegin,qend,addmark);
    15     ST[root].val = operation(ST[root*2].val,ST[root*2+1].val);
    16 }

    总:

     1 const int maxn = 100004;
     2 struct node
     3 {
     4     long long val;
     5     long long addmark;
     6 } ST[4*maxn+5];
     7 long long A[maxn];
     8 //修改求和还是维护区间最小值
     9 long long operation(long long a,long long b)
    10 {
    11     return a+b;
    12     //return max_min(a,b);
    13 }
    14 //修改求和还是维护区间最小值
    15 void change(int pos,long long addmark,int l)
    16 {
    17     ST[pos].val +=addmark*l;
    18 }
    19 void build(int root,int ibegin,int iend)
    20 {
    21     ST[root].addmark = 0;
    22     if (ibegin==iend)
    23         ST[root].val = A[ibegin];
    24     else
    25     {
    26         int mid = (ibegin+iend)/2;
    27         build(2*root,ibegin,mid);
    28         build(2*root+1,mid+1,iend);
    29         ST[root].val = operation(ST[root*2].val,ST[root*2+1].val);
    30     }
    31 }
    32 void push_down(int root,int l)
    33 {
    34     if (ST[root].addmark == 0) return;
    35     long long addmark = ST[root].addmark;
    36     ST[root*2].addmark+=addmark;
    37     ST[root*2+1].addmark+=addmark;
    38     change(root*2,addmark,l-l/2);
    39     change(root*2+1,addmark,l/2);
    40     ST[root].addmark = 0;
    41 }
    42 long long query(int root,int ibegin,int iend,int qbegin,int qend)
    43 {
    44     if (ibegin > qend || iend < qbegin)
    45         return 0;//
    46     if (ibegin>=qbegin&&iend<=qend)
    47         return ST[root].val;
    48     push_down(root,iend-ibegin+1);
    49     int mid = (ibegin+iend)/2;
    50     return operation(query(root*2,ibegin,mid,qbegin,qend),query(root*2+1,mid+1,iend,qbegin,qend));
    51 }
    52 void updata(int root,int ibegin,int iend,int qbegin,int qend,long long addmark)
    53 {
    54     if (ibegin > qend || iend < qbegin)
    55         return ;//
    56     if (ibegin>=qbegin&&iend<=qend)
    57         {
    58             ST[root].addmark+=addmark;
    59             change(root,addmark,iend-ibegin+1);
    60             return;
    61         }
    62     push_down(root,iend-ibegin+1);
    63     int mid = (ibegin+iend)/2;
    64     updata(root*2,ibegin,mid,qbegin,qend,addmark);
    65     updata(root*2+1,mid+1,iend,qbegin,qend,addmark);
    66     ST[root].val = operation(ST[root*2].val,ST[root*2+1].val);
    67 }
    总线段树
  • 相关阅读:
    TCP_UCP通信原理及案例
    JavaScript高级笔记DOM与BOM
    JavaScript基本语法,基本对象,正则表达式
    JDBC连接池&JDBCTemplate&Sping JDBC
    JDBC,JDBCUtils,JDBC控制事务
    自动化工具ansible(0——准备部署工作)
    监控软件篇——prometheus+exporter组件+grafana
    命令工具篇
    sed 命令备忘
    ES6数据分组
  • 原文地址:https://www.cnblogs.com/HITLJR/p/6576626.html
Copyright © 2020-2023  润新知