望你没有因此而功亏一篑过|

wnsyou

园龄:2年4个月粉丝:19关注:16

2023-10-07 13:10阅读: 58评论: 0推荐: 0

倍增和 ST 表

倍增

OI-wiki Link

倍增,顾名思义就是成倍增长。可以在 O(nlogn) 的预处理后将 O(n) 的询问降低到 O(logn),大大降低时间复杂度。

倍增主要运用于 RMQ 问题或 LCA 问题。

思想

举个例子,假设现在给定了一个长度为 n(n105) 的整数数组 a,你需要回答 q(q105) 组询问,每次询问给定 l,r,求 maxlir{ai}

暴力找?O(n×q) 爆炸了,这时就需要使用倍增来处理了。为了将询问复杂度降低到对数级别,则需先预处理。对于每个 i,预处理出 [i,i],[i20,i],[i21,i],[i22,i][i2logn,i] 的最大值(如果左端点小于 0 则当 0 处理)。

具体实现

mx[i][j] 表示 maxmax(1,i2j+1)ki{ai},则有 mx[i][0] = a[i],当 j 为正数时 mx[i][j] = max(mx[i][j - 1], mx[max(0, i - (1 << (j - 1)))][j - 1])

询问处理

对于一段区间 [l,r],可以将长度 rl+1 做一次二进制拆分,按位从高到低枚举,如果当前位(第 i 位)为 1,则 mx[r][i] 会产生共享,统计进去,再右移 rr2i

时间复杂度:O(logn)


除了维护区间 RMQ,还可以 O(logn) 维护树上两点间的 LCA。

首先预处理出每个节点的 20,21,222logn 级祖先,令 fa[i][j] 表示 i2j 级祖先,则可以先搜索找出每个节点的 20 级祖先,然后就有当 j 为正数时,fa[i][j] = fa[fa[i][j - 1]][j - 1]

当要求 xy 的 LCA 时,首先让两个点跳到同一深度,令 h[i] 表示节点 i 的深度,且 h[x] <= h[y],那么就先让 y 跳到 yh[y] - h[x] 级祖先处,如果此时 x=y,那么直接返回 x 即可。

否则,按位(i)从大到小枚举,如果 fa[x][i] != fa[y][i],那么 x = fa[x][i], y = fa[y][i],最后返回 fa[x][0] 即可。

ST 表

OI-wiki Link

ST 表是用于解决可重复贡献问题的数据结构(例如解决区间 RMQ 或区间 gcd 等问题),基于倍增思想

还是用上面的例子,求一段区间的最大值。倍增可以 O(logn) 解决,而 ST 表则更是大优化,可以 O(1) 处理询问!

思想

首先和倍增一样预处理。

由于 RMQ 问题是可重复共献问题(即只要处理的区间在询问区间范围内且包含了范围内的所有可贡献元素,即使重复计算也不影响答案),所以可以考虑将其拆分成两个区间处理,只要这两个区间的并集为 [l,l+1r]

处理

首先预处理出 1nlogLogi={0i=1Logi2+1i2

那么就好办了,对于一个区间 [l,r] 最大值就是 max(mx[r][Log[r - l + 1]], mx[l + (1 << Log[r - l + 1]) - 1][Log[r - l + 1]])

询问 O(1) 处理。

P3865 【模板】ST 表

#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int n, m, mx[N][20], l, r, Log[N];
int main () {
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> m, Log[0] = -1;
for (int i = 1; i <= n; i++) {
cin >> mx[i][0], Log[i] = Log[i / 2] + 1;
}
for (int i = 1; i <= 16; i++) {
for (int j = (1 << i); j <= n; j++) {
mx[j][i] = max(mx[j][i - 1], mx[j - (1 << (i - 1))][i - 1]);
}
}
for (int i = 1; i <= m; i++) {
cin >> l >> r;
cout << max(mx[r][Log[r - l + 1]], mx[l + (1 << Log[r - l + 1]) - 1][Log[r - l + 1]]) << '\n';
}
return 0;
}

本文作者:wnsyou

本文链接:https://www.cnblogs.com/wnsyou-blog/p/binary_lifting.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wnsyou  阅读(58)  评论(0编辑  收藏  举报
  1. 1 勝利への道 安藤浩和
  2. 2 Minecraft’s End Eric Fullerton
  3. 3 月光曲完整版 贝多芬 云熙音乐
  4. 4 平凡之路 (Live版) 朴树
  5. 5 Minecraft C418
  6. 6 Paradise NiziU
  7. 7 叫我,灰原哀 龙大人不喷火
  8. 8 心机之蛙,一直摸你肚子 ——《名侦探柯南》原创同人曲 炊饭,叶辞樱,温海,寒砧,南柯柯,小茜玛姬,盛姝,阿崔Ac,贝壳初,千湛,兮茶子DaYu,乔慕,黎鹿北,起千温卿,遮阳伞,曲悠
  9. 9 战 歌 此去经年
心机之蛙,一直摸你肚子 ——《名侦探柯南》原创同人曲 - 炊饭,叶辞樱,温海,寒砧,南柯柯,小茜玛姬,盛姝,阿崔Ac,贝壳初,千湛,兮茶子DaYu,乔慕,黎鹿北,起千温卿,遮阳伞,曲悠
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 一殇/白祺/苏少安/苏栗无/公子无央/白刃昏鸦/非欢/清茗/未及昭声/汀帆/赵艹地

作曲 : 沐若

心机之蛙,一直摸你肚子

——《名侦探柯南》原创同人曲

策划:炊饭

作曲:沐若

作词:一殇、白祺、苏少安、苏栗无、公子无央、白刃昏鸦、非欢、清茗、未及昭声、汀帆、赵艹地

编曲:斓音音乐实验室

演唱:叶辞樱、温海、寒砧、南柯、小茜玛姬、墨催、阿崔Ac、贝壳初、千湛、兮茶子、乔慕、黎鹿北、起千温卿、遮阳伞、曲悠

后期:幽谷

题字/美工:徒夫

监制:楠烛

【角色-词作-歌手】

【铃木园子-一殇-叶辞樱】

没有绝对杀机

爱恨调转 对错是唯一

【赤井秀一-白祺-温海】

枪膛里银色子弹

最后的致命一击

-

【毛利小五郎-苏少安-寒砧】

沉睡倒看真相 别小瞧绅士

叼烟来探 糊涂作势

【妃英理-白祺-南柯】

剥离出实情

透过谎言再续 不败传奇

-

【苏栗无-樱/砧/海/柯】

迷茫中看见吗 向谁的真谛

让谁的眼泪 都变成迷离

罪的答案是你 路的尽头是你

-

【怪盗基德-公子无央-小茜玛姬】

Kaitou 这雪白的谜语 将帽檐压低

以滑翔翼敬礼 向手铐和你

【服部平次-白刃昏鸦-墨催】

爱与真相是唯一

十字路口 迷宫的暗语

-

【灰原哀-非欢-乔慕】

回到少年时期 退化至逃离

像天才的过去 深海的鲨鱼

【毛利兰-非欢-起千温卿】

害怕妖怪和雷雨

正义和你 是我的勇气

-

【清茗-姬/催/慕/卿/悠】

天才与罪犯在探试 我已锁定案件起始

黑暗中蛰伏无休止 被贪欲吞噬

黄昏时 布谷钟请柬送至

跋涉深渊之池 侦探们的镇魂诗

-

【目暮十三-一殇-阿崔Ac】

樱花之名起誓

追寻真相 对罪恶通缉

【阿笠博士-苏少安-贝壳初】

古怪是科学正义

热衷将永不歇止

-

【安室透-白刃昏鸦-千湛】

被隐去的名姓 真伪皆归零

谜面重启 逆向独行

【琴酒-未及昭声-兮茶子】

用死亡美学 虔诚将你献祭

无声狙击

-

【汀帆-崔/初/湛/茶】

拨开重重迷题 信仰即期许

平扫僵阵地 守一方境域

且看如何踏破 早已残废终局

-

【江户川柯南-未及昭声-黎鹿北】

真相 折射在那镜片 透视在眼底

借时间逆行 拆穿真凶伏笔

【工藤新一-公子无央-遮阳伞】

骄傲是天才之理

逐一剖析 黑色的缝隙

-

【赵艹地-鹿/伞】

转动命运齿轮 去超越世纪

继续探查疑案 来解开谜题

【贝尔摩德-赵艹地-曲悠】

最喜爱伪装神秘

卷入迷雾 从容扣动扳机

-终-

加载中…

{{tag.name}}

{{tran.text}}{{tran.sub}}
无对应文字
有可能是
{{input}}
尚未录入,我来提交对应文字
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示