当前位置: 首页 > news >正文

一网科技有限公司seo独立站

一网科技有限公司,seo独立站,阿里巴巴1688网站做店铺,深圳网络建设公司不重点介绍线段树概念了,就大概贴一下几部分的模板 build(); 建立线段树 update(); 更新操作(单点、区间更新) query(); 查询操作(单点、区间查询) pushup(); 向上回溯 pushdown(); 向下延时更新 先说明一下数组 int s[…

 

不重点介绍线段树概念了,就大概贴一下几部分的模板

build();             建立线段树

update();          更新操作(单点、区间更新)

query();            查询操作(单点、区间查询)

pushup();         向上回溯

pushdown();    向下延时更新

先说明一下数组

int s[maxx],mx[maxx<<2];   //s为输入数组,mx为求和或最值数组
int lazy[maxx<<2];         //lazy为延迟标记

首先,build线段树

void build(int l,int r,int rt)  //rt为节点编号,l,r为节点区间
{if(l==r)      //寻找到一个叶节点{mx[rt]=s[l];return ;}int mid=(l+r)>>1;build(l,mid,rt<<1);      //左右递归build(mid+1,r,rt<<1|1); pushup(rt);         //向上回溯    
}

pushup

void pushup(int rt)   //向上回溯
{mx[rt]=max(mx[rt<<1],mx[rt<<1|1]);
}

update分为单点更新和区间更新(需要延迟标记)

先来简单一些的单点更新

void update(int L,int s,int l,int r,int rt)   //单点更新
{if(l==r)                                 //找到叶节点,进行修改{mx[rt]=s;return ;}int mid=(l+r)>>1;if(L<=mid)  update(L,s,l,mid,rt<<1);        //判断调用左子树还是右子树else        update(L,s,mid+1,r,rt<<1|1);pushup(rt);                                //向上回溯
}

接下来的区间更新需要用到延迟标记,这里用lazy表示

当有[l,r]区间内的值都需要改变时,若是使用单点更新会极大浪费时间,增加复杂度,这里lazy就是为了降低时间复杂度而存在,是线段树比较快的精华所在

第一次学lazy怎么都理解不了,这次学习看了大牛的博客后,个人觉得线段树的lazy标记和差分数组很像

条件都是需要改变一个区间内的所有值,使用一个特定的数组,在特定位置进行标记,之后在需要展开计算的时候,再进行所有的计算

lazy标记的本节点已经更新,但是其子节点还需要更新,其余代码里详述

(差分数组就不仔细介绍了,毕竟线段树模板)

void Update(int L,int R,int c,int l,int r,int rt)  //区间更新
{if(L<=l && R>=r){                            //找到可更新区间mx[rt]+=c*(r-l+1);                       //本节点加上其所有子节点的值lazy[rt]+=c;                             //对本节点lazy进行标记return ;}int mid=(l+r)>>1;                            pushdown(rt,mid-l+1,r-mid);                  //向子节点延时更新if(L<=mid)  Update(L,R,c,l,mid,rt<<1);       //判断调用左子树还是右子树if(R>mid)   Update(L,R,c,mid+1,r,rt<<1|1);pushup(rt);
}

pushdown 向下延时更新

void pushdown(int rt,int l,int r)  //向下延时更新
{if(lazy[rt]){                  //因为可能已经有值,所以这里都是 +=lazy[rt<<1]+=lazy[rt];     //左子节点lazy标记更新lazy[rt<<1|1]+=lazy[rt];   //右子节点lazy标记更新mx[rt<<1]+=lazy[rt]*l;     //左子节点进行更新mx[rt<<1|1]+=lazy[rt]*r;   //右子节点进行更新lazy[rt]=0;                //将该标记清零}
}

最后还有query

单点查询

int query(int L,int l,int r,int rt)                       //单点查询
{if(l==r)  return mx[rt];                              //找到节点直接返回int mid=(l+r)>>1;int ret=0;if(L<=mid)  ret=max(ret,query(L,l,mid,rt<<1));        //判断调用左子树还是右子树else        ret=max(ret,query(L,mid+1,r,rt<<1|1));return ret;
}

区间查询

int query(int L,int R,int l,int r,int rt)                 //区间查询
{if(L<=l && R>=r) return mx[rt];                       //区间内直接返回int mid=(l+r)>>1;pushdown(rt,mid-l+1,r-mid);                           //向下更新,否则结果可能不正确int ret=0;if(L<=mid)  ret=max(ret,query(L,R,l,mid,rt<<1));      //判断调用左子树右子树if(R>mid)   ret=max(ret,query(L,R,mid+1,r,rt<<1|1));return ret;
}

以上都是递归版的线段树

(非递归版的还没有学习)

转载于:https://www.cnblogs.com/renxiaomiao/p/9642683.html

http://www.lbrq.cn/news/2714167.html

相关文章:

  • 门户网站 开发语言线上购买链接
  • 广东省广州市白云区白云湖街道山西seo和网络推广
  • 3d效果图多少钱一张青岛关键词推广seo
  • 烟台定制网站建设公司比较好的网络优化公司
  • 如何制作公司appseo工作流程图
  • 盐城注册公司流程和费用重庆seo优化公司
  • 网络网站租福州seo兼职
  • 学编程的步骤windows优化大师提供的
  • 怀化医保网站电子商务网站推广
  • 做外汇都要看什么网站快照网站
  • 靖江有帮助做苏宁易购网站的公司吗今天最新的新闻头条
  • 12306网站如何做解绑推广app是什么工作
  • 餐馆餐饮装修设计网站搜索优化技巧
  • 招生代理平台网站seo优化案例
  • 郑州企业网站seo如何推广普通话
  • 网站邮件发送功能怎么做免费做网站网站
  • 车陂手机网站建设报价海外seo推广公司
  • 怎么加入网站做微商城网络推广哪个平台好
  • 网站开发实习报告广州seo网站推广
  • 做网站和彩票的同步开奖怎么做广告推广代运营公司
  • 青岛个人接网站建设百度网盘在线登录入口
  • axure开始怎么做网站首页培训班报名
  • 江苏cms建站系统搜索引擎优化的根本目的
  • 食品网络营销策划方案seo测试工具
  • 企业网站建设中期报告模板南宁seo服务公司
  • 北仑网站建设网络营销是干什么的
  • 乐山网站建设唐山百度提升优化
  • SharePoint做网站好吗杭州seo排名公司
  • 中国室内设计装饰协会公司网站如何seo
  • 江苏省建设委员会网站南京seo网络推广
  • SpringMVC(详细版从入门到精通)未完
  • 【OpenCV】Mat详解
  • OpenCV 高斯模糊降噪
  • 《算法导论》第 22 章 - 基本的图算法
  • SQL详细语法教程(一)--数据定义语言(DDL)
  • 多轮问答与指代消解