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

     1 struct node
     2 {
     3     int l,r,sum,add,setv,minn,maxn;
     4 }tree[1<<];
     5 void build(int id,int l,int r){
     6     tree[id].l = l;  
     7     tree[id].r = r;  
     8     tree[id].add = 0;  
     9     tree[id].setv = 0;  
    10     if(l == r){  
    11         tree[id].sum = tree[id].minn = tree[id].maxn = a[l];  
    12         return;  
    13     }  
    14     int mid = (l+r)>>1;  
    15     build(id<<1,l,mid);  
    16     build(id<<1|1,mid+1,r);  
    17     maintain(id);  
    18 } 
    19 void updateSet(int id,int l,int r,int val){  
    20     if(tree[id].l >= l && tree[id].r <= r){  
    21         tree[id].setv = val;  
    22         tree[id].minn = val;  
    23         tree[id].maxn = val;  
    24         tree[id].add = 0;  
    25         tree[id].sum = (tree[id].r-tree[id].l+1)*val;  
    26         return;  
    27     }  
    28     pushdown(id);  
    29     int mid = (tree[id].l+tree[id].r)>>1;  
    30     if(l <= mid)  
    31         updateSet(id<<1,l,r,val);  
    32     if(mid < r)  
    33         updateSet((id<<1)+1,l,r,val);  
    34     maintain(id);  
    35 } 
    36 void updateAdd(int id,int l,int r,int val){  
    37     if(tree[id].l >= l && tree[id].r <= r){  
    38         tree[id].add += val;  
    39         tree[id].minn += val;  
    40         tree[id].maxn += val;  
    41         tree[id].sum += (tree[id].r-tree[id].l+1)*val;  
    42         return;  
    43     }  
    44     pushdown(id);  
    45     int mid = (tree[id].l+tree[id].r)>>1;  
    46     if(l <= mid)  
    47         updateAdd(id<<1,l,r,val);  
    48     if(mid < r)  
    49         updateAdd((id<<1)+1,l,r,val);  
    50     maintain(id);  
    51 } 
    52 void query(int id,int l,int r)//查询
    53 {  
    54      if(tree[id].l >= l && tree[id].r <= r){  
    55         anssum += tree[id].sum;  
    56         ansmin = min(ansmin,tree[id].minn);  
    57         ansmax = max(ansmax,tree[id].maxn);  
    58         return;  
    59     }  
    60     pushdown(id);  
    61     int mid = (tree[id].l+tree[id].r)>>1;  
    62     if(l <= mid)  
    63         query(id<<1,l,r);  
    64     if(mid < r)  
    65         query(id<<1|1,l,r);  
    66     maintain(id);  
    67 } 
    68 void maintain(int id)//向上回溯
    69 {  
    70     if(tree[id].l >= tree[id].r)  
    71         return ;  
    72     tree[id].maxn = max(tree[id<<1].maxn,tree[id<<1|1].maxn);  
    73     tree[id].minn = min(tree[id<<1].minn,tree[id<<1|1].minn);  
    74     tree[id].sum  = tree[id<<1].sum + tree[id<<1|1].sum;  
    75 } 
    76 void pushdown(int id)//延时更新
    77 {  
    78     if(tree[id].l >= tree[id].r)  
    79         return;  
    80     if(tree[id].setv){  
    81         tree[id<<1].setv = tree[id<<1|1].setv = tree[id].setv;  
    82         tree[id<<1].minn = tree[id<<1|1].minn = tree[id].setv;  
    83         tree[id<<1].maxn = tree[id<<1|1].maxn = tree[id].setv;  
    84         tree[id<<1].add = tree[id<<1|1].add = 0;  
    85         tree[id<<1].sum = (tree[id<<1].r-tree[id<<1].l+1)*tree[id].setv;  
    86         tree[id<<1|1].sum = (tree[id<<1|1].r-tree[id<<1|1].l+1)*tree[id].setv;  
    87         tree[id].setv = 0;  
    88     }  
    89     if(tree[id].add){  
    90         int tmp = tree[id].add;  
    91         tree[id<<1].add += tmp;tree[id<<1|1].add += tmp;  
    92         tree[id<<1].minn += tmp;tree[id<<1|1].minn += tmp;  
    93         tree[id<<1].maxn +=tmp;tree[id<<1|1].maxn += tmp;  
    94         tree[id<<1].sum += (tree[id<<1].r-tree[id<<1].l+1)*tmp;  
    95         tree[id<<1|1].sum += (tree[id<<1|1].r - tree[id<<1|1].l+1)*tmp;  
    96         tree[id].add = 0;  
    97     }  
    98 } 
  • 相关阅读:
    conan本地安装包
    Python PIL 怎么知道写入图片格式的kb大小
    怎么对C++枚举(不是类)里面的东西进行随机
    当双方Visual studio windows SDK不一样的时候的解决办法
    不小心使用vcpkg之后再使用conan,一直报链接错误
    关于obj文件的理解
    卸载VS2015之后,安装VS2017出错
    性状、生成器、闭包、OPcache【Modern PHP】
    docker容器修改hosts文件,重启失效问题解决
    微信公众号-模板消息通用接口封装
  • 原文地址:https://www.cnblogs.com/--lr/p/7227422.html
Copyright © 2011-2022 走看看