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

     1 struct node
     2 {
     3     int maxt,sum;
     4     int left,right;
     5 };
     6 struct node tree[4*K];
     7 int a[k];
     8 int build(int id,int l,int r)
     9 {
    10     tree[id].left=l;tree[id].right=r;
    11     if(l==r)
    12     {
    13         tree[id].maxt=tree[id].sum=a[l];
    14     }
    15     else
    16     {
    17         build(2*id,l,(l+r)/2);
    18         build(2*id+1,(l+r)/2+1,r);
    19         tree[id].maxt=max(tree[2*id].maxt,tree[2*id+1].maxt);
    20         tree[id].sum=tree[2*id].sum+tree[2*id+1].sum;
    21     }
    22     return 0;
    23 }
    24 long long queryMax(int id,int l,int r)
    25 {
    26     if(l==tree[id].left && r==tree[id].right)
    27         return tree[id].maxt;
    28     int mid=(tree[id].left+tree[id].right)>>1;
    29     long long ret=0;
    30     if(r<=mid)
    31         ret=max(ret,queryMax(id<<1,l,r));
    32     else if(l>=mid+1)
    33         ret=max(ret,queryMax((id<<1)+1,l,r));
    34     else
    35     {
    36         long long a,b;
    37         a=queryMax(id<<1,l,mid);
    38         b=queryMax((id<<1)+1,mid+1,r);
    39         return max(a,b);
    40     }
    41     return ret;
    42 }
    43 int update(int id,int pos,int v)
    44 {
    45     if(tree[id].left == tree[id].right)
    46     {
    47         tree[id].sum=tree[id].maxt=v;
    48     }
    49     else
    50     {
    51         int mid=(tree[id].left+tree[id].right)/2;
    52         if (pos<=mid) update(id*2,pos,v);
    53     else update(id*2+1,pos,v);
    54         tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
    55         tree[id].maxt=max(tree[id*2].maxt,tree[id*2+1].maxt);
    56     }
    57     return 0;
    58 }
    59 
    60 int query(int id,int l,int r)
    61 {
    62         if (tree[id].left==l&&tree[id].right==r)
    63             return tree[id].sum; 
    64         else
    65         {
    66             int mid=(tree[id].left+tree[id].right)/2;    
    67             if (r<=mid) return query(id*2,l,r);
    68             else if (l>mid) return query(id*2+1,l,r)
    69             else return query(id*2,l,mid)+query(id*2+1,mid+1,r);
    70         }
    71     }

    记得有个小地方打错变量名了,要用的话自己改下就好

  • 相关阅读:
    python threading 锁的应用
    python线程threading处理任务并发一
    *,arg,*args,**kwargs的使用
    web services 接口调用
    jsonp与ajax
    无缝滚动详解
    手机端使用rem适配
    css3写的实用表单美化
    经典仿淘宝商城菜单多条件查询
    css3 flex写的移动端界面
  • 原文地址:https://www.cnblogs.com/weeping/p/5483735.html
Copyright © 2011-2022 走看看