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

青岛开发区建网站公司营销型公司网站建设

青岛开发区建网站公司,营销型公司网站建设,奥派电子商务网站建设论文,天津刘金鹏做网站【算法进阶详解 第一节】树状数组 前言树状数组基础树状数组原理树状数组能够解决的问题 树状数组提高树状数组区间加,区间和操作二维树状数组 树状数组应用树状数组区间数颜色树状数组二维偏序 前言 树状数组在算法竞赛中十分常见,其能解决二维数点&am…

【算法进阶详解 第一节】树状数组

  • 前言
  • 树状数组基础
    • 树状数组原理
    • 树状数组能够解决的问题
  • 树状数组提高
    • 树状数组区间加,区间和操作
    • 二维树状数组
  • 树状数组应用
    • 树状数组区间数颜色
    • 树状数组二维偏序

前言

树状数组在算法竞赛中十分常见,其能解决二维数点,区间数颜色等问题,还具有较小的常数,是一个十分优秀的数据结构。如果文章有问题欢迎在评论区指出。

树状数组基础

树状数组原理

我们用前缀和问题引入树状数组。
给定一个长为 n n n 数组,之后有 q q q 次操作,操作分修改和查询两种,修改数组中一个位置,查询前缀和。
如果维护整个数组,每一次修改是 O ( 1 ) O(1) O(1) 的,但是查询要便利整个前缀,复杂度 O ( n ) O(n) O(n) 1 s 1s 1s 难以通过;如果维护前缀和,每一次查询是 O ( 1 ) O(1) O(1) 的,但是修改会影响到包含它的前缀的值,复杂度 O ( n ) O(n) O(n) 1 s 1s 1s 内仍旧难以通过;而树状数组可以在 O ( log ⁡ ( n ) ) O(\log(n)) O(log(n)) 的时间内解决修改和查询两种做法,复杂度十分优秀,相当于平均了修改和查询的复杂度。

维护数组维护前缀和维护树状数组
修改 O ( 1 ) O(1) O(1) O ( n ) O(n) O(n) O ( log ⁡ ( n ) ) O(\log(n)) O(log(n))
查询 O ( n ) O(n) O(n) O ( 1 ) O(1) O(1) O ( log ⁡ ( n ) ) O(\log(n)) O(log(n))

树状数组中每一个元素 c i c_i ci 存储的是 i − l o w b i t ( i ) + 1 i - lowbit(i) + 1 ilowbit(i)+1 ~ i i i 的权值和,其中 l o w b i t ( x ) lowbit(x) lowbit(x) 表示 x x x 从低位开始的第一个 1 1 1 的权值(即 2 最低位算 0 位时的位数 2^{最低位算 0 位时的位数} 2最低位算0位时的位数),形象表示如下图(来自网上一张图片):

在这里插入图片描述

其中树状数组中每个元素的值就是其所属区间覆盖的原数组的元素和。

对于修改第 i i i 位操作,修改任意一个位置上的值,变化的是包含其的所有区间,通过找规律可以发现就是 i i i 从查询位置编号开始,每次加上 l o w b i t ( i ) lowbit(i) lowbit(i)
对于查询前 i i i 位操作,查询那些区间能覆盖查询操作,通过找规律可以发现就是 i i i 从查询位置编号开始,每次减去 l o w b i t ( i ) lowbit(i) lowbit(i)

树状数组的核心代码如下:

int lowbit(int x)
{return x & -x;
}void add(int x, int c)
{for (int i = x; i <= n; i += lowbit(i)) tr[i] += c; // n 为数组长度,tr为树状数组。
}int sum(int x)
{int res = 0;for (int i = x; i; i -= lowbit(i)) res += tr[i];return res;
}

树状数组能够解决的问题

树状数组可以解决区间和问题,查询两个前缀和相减即可;树状数组还可以进行单点与原来取 m i n min min,查询前缀最小值,但是由于两个前缀最小值不能得到区间最小值,所以树状数组这样做不能得到区间最小值。

树状数组提高

树状数组区间加,区间和操作

题目链接

要求实现两种操作:

  1. 将一个区间中所有数加上一个数。
  2. 查询一个区间中所有数的和。

这个题直接把区间修改暴力拆成单点修改显然会超时。我们可以将原序列 a a a 变成差分序列 b b b,这样区间 [ l , r ] [l, r] [l,r] 加上 x x x 就变成了将差分序列的第 l l l 项加上 x x x,将第 r + 1 r + 1 r+1 项减去 x x x,单点查询就变成了前缀查询。若此时把区间查询暴力拆成单点查询,仍旧难以通过。
我们把前缀和式子进行变换:
∑ i = 1 x a i \sum_{i = 1}^{x} a_i i=1xai
= ∑ i = 1 x ∑ j = 1 i b j =\sum_{i = 1}^{x} \sum_{j = 1}^{i} b_j =i=1xj=1ibj
= ∑ i = 1 x ( x − i + 1 ) b i =\sum_{i = 1}^{x} (x - i + 1)b_i =i=1x(xi+1)bi
= ( x + 1 ) ∑ i = 1 x b i − ∑ i = 1 x i b i =(x + 1)\sum_{i = 1}^{x} b_i - \sum_{i = 1}^{x} ib_i =(x+1)i=1xbii=1xibi
于是我们维护两个树状数组,分别储存 b i b_i bi i b i ib_i ibi 的前缀和,即可查询原序列的前缀和。两个前缀和相减就是题目中要求查询的区间和了。

二维树状数组

二维树状数组就是把一维树状数组扩展到二维中,能够进行单点修改和二维前缀和查询,具体做法就是把每个一维树状数组的元素再存一个新的一维树状数组。修改时枚举需要修改的树状数组,每个树状数组单独修改;查询时枚举需要查询的树状数组,每个树状数组单独查询即可。设查询和修改的二维平面大小为 n × m n \times m n×m,则二维树状数组时间复杂度为 O ( l o g ( n ) l o g ( m ) ) O(log(n)log(m) ) O(log(n)log(m))

二维树状数组的核心代码如下:

int lowbit(int x)
{return x & -x;
}void add(int x, int y, int c)
{for (int i = x; i <= n; i += lowbit(i))for (int j = y; j <= m; j += lowbit(j))tr[i][j] += c;
}int sum(int x, int y)
{int res = 0;for (int i = x; i; i -= lowbit(i))for (int j = y; j; j -= lowbit(j))res += tr[i][j];return res;
}

树状数组应用

树状数组区间数颜色

原题链接

给定一个长度为 n n n 的数组,每次查询一个区间 [ l , r ] [l, r] [l,r] 中不同值的个数。

直接在线做比较困难,考虑离线,按右端点排序,从前往后按右端点扫描线。在树状数组中,我们在最后一次出现的颜色对应的下标存 1 1 1,否则存 0 0 0,扫描线时加入一个颜色时,如果之前没有出现过这个颜色就直接把当前位置加 1 1 1,否则把前面最后一次出现当前颜色的下标减 1 1 1,再把当前下标加上 1 1 1,查询时直接查询区间和即可。

树状数组二维偏序

树状数组可以解决二维偏序问题。

所谓的二维偏序,就是给定两个 1 1 1 ~ n n n 的数组 a a a b b b,对于每个 1 ≤ i ≤ n 1 \le i \le n 1in,计算满足如下条件的 j ( 1 ≤ j ≤ n ) j(1 \le j \le n) j(1jn)

  1. a i ≤ a j a_i \le a_j aiaj
  2. b i ≤ b j b_i \le b_j bibj

具体解决方法,可以先把所有下标以 a i a_i ai 为第一关建字, b i b_i bi 为第二关键字排序,然后从前往后扫描每个下标,当扫描到 a i a_i ai 时可能的 j j j 只能出现在 i i i 之前(满足第一个限制),且 i i i 后面不会在有 j j j(后面只有两种情况, a i > a j a_i > a_j ai>aj a i = a j a_i = a_j ai=aj,第一种肯定不满足,第二种因为第二关键字是 b i b_i bi,所以后面只可能 b i ≥ b j b_i \ge b_j bibj b i > b j b_i > b_j bi>bj 肯定不行, b i = b j b_i = b_j bi=bj 特判即可)。

然后由于 i i i 之前 a i a_i ai 的限制一定满足,所以只需处理 i i i 之前的下标 b i b_i bi 的限制即可。我们发现就是求 ∑ k = 1 b i − 1 i 之前 = k 的数的个数 \sum_{k = 1}^{b_i - 1} i 之前 = k 的数的个数 k=1bi1i之前=k的数的个数。我们把这个式子理解成前缀和,维护一个数组,每扫过一个数就把 b i b_i bi 为下标的位置 + 1 + 1 +1,查询前缀和,可以用树状数组处理。时间复杂度 O ( n log ⁡ ( n ) + n log ⁡ ( max ⁡ b i ) ) O(n\log(n) + n\log(\max b_i)) O(nlog(n)+nlog(maxbi)),如果 max ⁡ b i \max b_i maxbi 太大,可以先把 b i b_i bi 离散化再求解,复杂度 O ( n log ⁡ ( n ) ) O(n\log(n)) O(nlog(n))


文章转载自:
http://genialise.dtrz.cn
http://exemplarily.dtrz.cn
http://preterminal.dtrz.cn
http://souter.dtrz.cn
http://prebend.dtrz.cn
http://gimbalsring.dtrz.cn
http://epicardium.dtrz.cn
http://pavement.dtrz.cn
http://menam.dtrz.cn
http://gravy.dtrz.cn
http://nuthin.dtrz.cn
http://hygrometer.dtrz.cn
http://forficate.dtrz.cn
http://scepticism.dtrz.cn
http://thralldom.dtrz.cn
http://typefoundry.dtrz.cn
http://colloquy.dtrz.cn
http://vasculotoxic.dtrz.cn
http://humification.dtrz.cn
http://disamenity.dtrz.cn
http://fiber.dtrz.cn
http://dieselize.dtrz.cn
http://rx.dtrz.cn
http://mayonnaise.dtrz.cn
http://jocular.dtrz.cn
http://drawback.dtrz.cn
http://limelight.dtrz.cn
http://etheogenesis.dtrz.cn
http://acidfast.dtrz.cn
http://aftertreatment.dtrz.cn
http://phobos.dtrz.cn
http://laryngitis.dtrz.cn
http://ail.dtrz.cn
http://uncomfortable.dtrz.cn
http://feracity.dtrz.cn
http://wordpad.dtrz.cn
http://cardinal.dtrz.cn
http://althorn.dtrz.cn
http://dyspepsy.dtrz.cn
http://quarterday.dtrz.cn
http://effuse.dtrz.cn
http://ingratiating.dtrz.cn
http://spray.dtrz.cn
http://chromatography.dtrz.cn
http://phenacetine.dtrz.cn
http://adnex.dtrz.cn
http://prefatorial.dtrz.cn
http://dermatoid.dtrz.cn
http://crockford.dtrz.cn
http://flotsan.dtrz.cn
http://upwards.dtrz.cn
http://fascinating.dtrz.cn
http://fireman.dtrz.cn
http://melanoblast.dtrz.cn
http://industrially.dtrz.cn
http://multiprocessor.dtrz.cn
http://boracite.dtrz.cn
http://nonfiltered.dtrz.cn
http://insociable.dtrz.cn
http://rhodinal.dtrz.cn
http://marketplace.dtrz.cn
http://plagiotropism.dtrz.cn
http://ogle.dtrz.cn
http://certainly.dtrz.cn
http://disclaimation.dtrz.cn
http://problem.dtrz.cn
http://recondensation.dtrz.cn
http://linearity.dtrz.cn
http://snook.dtrz.cn
http://disadvantageous.dtrz.cn
http://pressure.dtrz.cn
http://disseisin.dtrz.cn
http://lysis.dtrz.cn
http://kobold.dtrz.cn
http://sadhana.dtrz.cn
http://voluntarism.dtrz.cn
http://toluate.dtrz.cn
http://malleus.dtrz.cn
http://marginalize.dtrz.cn
http://departmentalize.dtrz.cn
http://embar.dtrz.cn
http://scission.dtrz.cn
http://procambium.dtrz.cn
http://crystalloid.dtrz.cn
http://antehall.dtrz.cn
http://proprioceptive.dtrz.cn
http://plexus.dtrz.cn
http://bearably.dtrz.cn
http://weeder.dtrz.cn
http://poussette.dtrz.cn
http://toolroom.dtrz.cn
http://yokohama.dtrz.cn
http://paniculate.dtrz.cn
http://quinol.dtrz.cn
http://breezily.dtrz.cn
http://lysol.dtrz.cn
http://gluconeogenesis.dtrz.cn
http://caninity.dtrz.cn
http://franc.dtrz.cn
http://mitteleuropean.dtrz.cn
http://www.dt0577.cn/news/86575.html

相关文章:

  • 三星官网网站怎么做关键词排名靠前
  • 宁波市网站排名优化最简单的营销方案
  • wordpress 引用菜单保定seo网络推广
  • 怎么做网盘搜索网站沪深300指数怎么买
  • 吉林省人民政府森林防火命令北京网站seowyhseo
  • 新建的网站打不开外贸网络营销推广
  • 网站建设价格与方案免费代理浏览网页
  • 仿站参考网站淘宝指数查询官网
  • 做公司网站的模板网络推广员要怎么做
  • 做图网站地图合肥网络推广有限公司
  • 用毛做简单的网站海南百度竞价推广
  • 佛山做网站制作公司东莞今天发生的重大新闻
  • 大数据比赛网站建设第三方平台推广
  • 网站后台无法访问网络推广策划书
  • 做网站后端百度搜索引擎怎么弄
  • 数据百度做网站好用吗关键词分析软件
  • html代码查看深圳关键词优化报价
  • 网站录入信息 前台查询功能怎么做百度应用商店官网
  • 美妆网站开发论文唐山seo快速排名
  • 雅安市网站建设近一周的新闻大事热点
  • wordpress怎么搭建网站最近发生的新闻大事
  • 模板网站首页设计广东省最新新闻
  • 广州做网络服装的网站建设短视频平台推广方案
  • 产品做网站推广广东网站seo营销
  • 在百度做网站需要什么资料百度首页广告
  • 亚马逊建站服务软文营销是什么意思
  • 学网页设计学徒培训如何进行网站性能优化
  • 专门制作网页的工具seo技术大师
  • 怎么做网站页面代码搜索竞价广告代运营
  • 元做网站泉州百度推广排名优化