ST表模板

news/2024/9/18 15:18:50/ 标签: 算法, c++, ST表, 倍增

P3865 【模板】ST 表 && RMQ 问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:区间最大值,模板题。

int n,m;
int arr[100005];
int f[100005][25];     (1<<20)=1e6
void init(){                                o(nlogn)for(int i=1;i<=n;i++) f[i][0]=arr[i];for(int j=1;j<=20;j++){     枚举区间长度for(int i=1;i+(1<<j)-1<=n;i++){    枚举区间起点f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);}}
}
inline int query(int l,int r){         o(1)int k=log2(r-l+1);return max(f[l][k],f[r-(1<<k)+1][k]);
}
【模板】ST 表 && RMQ 问题
https://www.luogu.com.cn/problem/P3865
void solve(){cin>>n>>m;for(int i=1;i<=n;i++) cin>>arr[i];init();while(m--){int l,r; cin>>l>>r;cout<<query(l,r)<<endl;}
}

P2251 质量检测 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:区间最小值,模板题。

int n,m;
int arr[1000006];
int f[1000006][25];   (1<<20)=1e6
void init(){for(int i=1;i<=n;i++) f[i][0]=arr[i];for(int j=1;j<=20;j++){for(int i=1;i+(1<<j)-1<=n;i++){f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);}}
}
int query(int l,int r){int k=log2(r-l+1);return min(f[l][k],f[r-(1<<k)+1][k]);
}
P2251 质量检测
https://www.luogu.com.cn/problem/P2251
void solve(){cin>>n>>m;for(int i=1;i<=n;i++) cin>>arr[i];init();for(int i=1;i+m-1<=n;i++){int l=i,r=i+m-1;cout<<query(l,r)<<endl;}
}

P2880 [USACO07JAN] Balanced Lineup G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:区间极差,也是模板题。

int n,q;
int arr[50004];
int mx[50004][25];
int mi[50004][25];
void init(){for(int i=1;i<=n;i++) mx[i][0]=arr[i],mi[i][0]=arr[i];for(int j=1;j<=20;j++){     枚举区间长度,因为是2^j,所以永远是偶数for(int i=1;i+(1<<j)-1<=n;i++){ 枚举区间起点,i+(1<<j)-1<=n保证了当前枚举的区间起点及长度不会超出nmx[i][j]=max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]);mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]);}}
}
int query(int l,int r){int k=log2(r-l+1);return max(mx[l][k],mx[r-(1<<k)+1][k])-min(mi[l][k],mi[r-(1<<k)+1][k]);
}
纯板子--区间询问极差
P2880 [USACO07JAN] Balanced Lineup G
https://www.luogu.com.cn/problem/P2880
void solve(){cin>>n>>q;for(int i=1;i<=n;i++) cin>>arr[i];init();while(q--){int l,r; cin>>l>>r;cout<<query(l,r)<<endl;}
}

[ABC352D] Permutation Subsequence - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路: 思维题,换个角度(下标)维护区间最大最小值。思想类似用树状数组求逆序对中,桶的作用 转换之后实际上就是求区间长度为k的最小极差。

int n,k;
int arr[200005];
int mx[200005][25];
int mi[200005][25];
void init(){for(int i=1;i<=n;i++) mx[i][0]=arr[i],mi[i][0]=arr[i];for(int j=1;j<=20;j++){for(int i=1;i+(1<<j)-1<=n;i++){mx[i][j]=max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]);mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]);}}
}
int query(int l,int r){int x=log2(r-l+1);return max(mx[l][x],mx[r-(1<<x)+1][x])-min(mi[l][x],mi[r-(1<<x)+1][x]);
}
思维题,换个角度(下标)维护区间最大最小值。思想类似用树状数组求逆序对中,桶的作用
转换之后实际上就是求区间长度为k的最小极差
[ABC352D] Permutation Subsequence
https://www.luogu.com.cn/problem/AT_abc352_d
void solve(){cin>>n>>k;for(int i=1;i<=n;i++){int x; cin>>x;arr[x]=i;}init();int ans=INT_MAX;for(int i=1;i+k-1<=n;i++) ans=min(ans,query(i,i+k-1));cout<<ans;
}

P2866 [USACO06NOV] Bad Hair Day S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:ST表+二分

法二:ST表,比单调栈麻烦,ST表预处理的是每个区间最大值,然后枚举i,二分区间右端点,进行o(1)查询[i+1,mid]是否合法
题目理解为每头牛向右看,有多少个比自己矮的,遇到第一个>=自己的就不算了.
int n;
int arr[80004];
法一:单调栈--题目理解为每个牛向左看,能看到多少个比自己高的,那么就是从左到右维护单调递减的栈
P2866 [USACO06NOV] Bad Hair Day S
https://www.luogu.com.cn/problem/P2866
void solve(){cin>>n;for(int i=1;i<=n;i++) cin>>arr[i];stack<int> stk;int ans=0;for(int i=1;i<=n;i++){if(stk.size()&&arr[i]<stk.top()) ans+=stk.size();else if(stk.size()&&arr[i]>=stk.top()){     取等,因为是从右往左看,同等身高的不能算while(stk.size()&&arr[i]>=stk.top()) stk.pop();ans+=stk.size();}stk.emplace(arr[i]);}cout<<ans;
}int n;
int arr[80004];
int f[80004][25];
void init(){for(int i=1;i<=n;i++) f[i][0]=arr[i];for(int j=1;j<=20;j++){for(int i=1;i+(1<<j)-1<=n;i++){f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);  1<<(j-1)}}
}
int query(int l,int r){    o(1)int k=log2(r-l+1);return max(f[l][k],f[r-(1<<k)+1][k]);
}
法二:ST表,比单调栈麻烦,ST表预处理的是每个区间最大值,然后枚举i,二分区间右端点,进行o(1)查询[i+1,mid]是否合法
题目理解为每头牛向右看,有多少个比自己矮的,遇到第一个>=自己的就不算了.
P2866 [USACO06NOV] Bad Hair Day S
https://www.luogu.com.cn/problem/P2866
void solve(){cin>>n;for(int i=1;i<=n;i++) cin>>arr[i];init();int ans=0;for(int i=1;i<=n-1;i++){   o(nlogn)int l=i+1,r=n,res=i;while(l<=r){int mid=(l+r)>>1;if(query(i+1,mid)<arr[i]){res=mid;l=mid+1;}else r=mid-1;}ans+=res-i;}cout<<ans;
}

P7167 [eJOI2020 Day1] Fountain - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路: 标签:倍增ST表,应该再加个二分标签。

ST表用作二分找第i个盘的下一个盘,然后建图 建图之后倍增

倍增的过程跟lca的初始化过程同理。

int n,q;
pair<int,int> arr[100005];
int mx[100005][25];
int nex[100005];
void init1(){for(int i=1;i<=n;i++) mx[i][0]=arr[i].first;for(int j=1;j<=20;j++){for(int i=1;i+(1<<j)-1<=n;i++){mx[i][j]=max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]);}}
}
int query(int l,int r){int k=log2(r-l+1);return max(mx[l][k],mx[r-(1<<k)+1][k]);
}
pair<int,int> f[100005][25];   f[i][j]定义为,从第i个点往下跳2^j步,为<累计水容量,到达的层数编号>
void init2(){           往下跳--倍增for(int i=1;i<=n;i++) f[i][0]={arr[i].second+arr[nex[i]].second,nex[i]};for(int j=1;j<=20;j++){for(int i=1;i+(1<<j)-1<=n;i++){int halfIdx=f[i][j-1].second;f[i][j].first=f[i][j-1].first+f[halfIdx][j-1].first-arr[halfIdx].second;f[i][j].second=f[halfIdx][j-1].second;}}
}
标签:倍增ST表,,应该再加个二分标签
ST表用作二分找第i个盘的下一个盘,然后建图
建图之后倍增,跟lca的初始化过程同理
基本上是一发入魂(最后输出答案的地方判错了一点,导致全wa)!!无敌了,第一次写倍增。
P7167 [eJOI2020 Day1] Fountain
https://www.luogu.com.cn/problem/P7167
void solve(){                   好题,好题.倍增入门题.cin>>n>>q;for(int i=1;i<=n;i++) cin>>arr[i].first>>arr[i].second;   <直径,容量>init1();for(int i=1;i<=n;i++){    o(nlogn)  n次二分,每次check是o(1)的int l=i+1,r=n,res=0;while(l<=r){int mid=(l+r)>>1;if(query(i+1,mid)>arr[i].first){res=mid;r=mid-1;}else l=mid+1;}nex[i]=res;   建图}init2();while(q--){int x,v; cin>>x>>v;if(v<=arr[x].second) cout<<x<<endl;else{int cur=x;j从大到小for(int j=20;j>=0;j--){if(f[cur][j].second!=0&&f[cur][j].first<=v){v-=f[cur][j].first;cur=f[cur][j].second;v+=arr[cur].second;}}if(v<=arr[cur].second) cout<<cur<<endl; v<=arr[cur].second 而不是v==0else cout<<nex[cur]<<endl;}}
}

to be continue...


http://www.ppmy.cn/news/1516699.html

相关文章

爆改YOLOv8|利用SENetV2改进yolov8,暴力涨点

1&#xff0c;本文介绍 本文探讨了将 SENetV2 的稠密聚合层与 SE 模块结合&#xff0c;应用于 YOLOv8&#xff0c;以提升特征表达能力和目标检测性能。SENetV2 通过 Squeeze-and-Excitation&#xff08;SE&#xff09;模块优化通道和全局特征&#xff0c;从而提高分类准确率。…

UE5.4内容示例(5)UI_CommonUI - 学习笔记

https://www.unrealengine.com/marketplace/zh-CN/product/content-examples 《内容示例》是学习UE5的基础示例&#xff0c;可以用此熟悉一遍UE5的功能 UI_CommonUI可以看这个视频学习&#xff0c;此插件处于Beta状态&#xff0c;应用UI游戏方面&#xff0c;支持手柄等多输入端…

sap 开发工具 jdbc odbc 驱动 下载地址

SAP Development Tools (ondemand.com) sap 开发工具 jdbc odbc 驱动 下载地址

【系统架构设计师-2018年】综合知识-答案及详解

文章目录 【第1题】【第2~3题】【第4题】【第5~6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16~17题】【第18~21题】【第22题】【第23题】【第24题】【第25题】【第26题】【第27~28题】【第29~30题】【第31题】【第32~3…

学习前端面试知识(16)

computed和watch 参考文章vue computed 计算属性&#xff0c;有缓存功能&#xff0c;底层通过dirty来判断是否重新计算&#xff0c;只有在依赖数据发生变化时才会重新计算&#xff0c;性能更好。不能进行异步操作。缓存属性受多个属性影响&#xff0c;比如购物车商品结算函数…

OSPF-基础多区域实验

1.ENSP下载 阿里云盘分享 ⭐/*无需密钥 免费下载 安装不成功&#xff0c;可关注并私信博主*/ 2.OSPF的基础需求和规则 实验规则&#xff1a; 1.接口地址→XY.XY.XY.R /24 X:两者之间最小的 Y:两者之间最大的 R:谁的接口就是谁的编号 以R1和R2之间的连接为例&#xff0…

公司主域控服务器彻底崩溃了,蓝屏了,永久坏了!那怎么把备域提升到主域服务器呢?

一、需求描述 兄弟们&#xff0c;AD1主域控服务器彻底崩溃了&#xff0c;蓝屏了&#xff0c;永久坏了&#xff01;那怎么把AD2从备域提升到主域服务器呢&#xff1f;现在AD1主域控一直蓝屏&#xff0c;已经无法修复了。 尝试了很多方法&#xff0c;安全模式也进入不了&#xf…

系统架构分析

一、速通一图流 二、系统架构功能、作用分析 1. Furion&#xff1a;框架核心层 功能&#xff1a;这是 Furion 框架的核心层&#xff0c;通常包含框架本身的基本功能和配置。这一层应该是比较稳定的&#xff0c;不应该包含业务逻辑&#xff0c;而是提供项目其他部分需要依赖的…

《数据资产管理核心技术与应用》读书笔记-第四章:数据质量的技术实现(二)

《数据资产管理核心技术与应用》是清华大学出版社出版的一本图书&#xff0c;全书共分10章&#xff0c;第1章主要让读者认识数据资产&#xff0c;了解数据资产相关的基础概念&#xff0c;以及数据资产的发展情况。第2&#xff5e;8章主要介绍大数据时代数据资产管理所涉及的核心…

pycharm redis 库

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的 内存中数据结构存储系统&#xff0c;用作数据库、缓存和消息代理。它支持多种类型的数据结构&#xff0c;如字符串&#xff08;strings&#xff09;、哈希&#xff08;hashes&#xff09;、列表&#xff08…

LongWriter——从长文本语言模型中释放出10,000+字的生成能力

概述 当前的长上下文大型语言模型 (LLM) 可以处理多达 100,000 个词的输入&#xff0c;但它们很难生成超过 2,000 个词的输出。受控实验表明&#xff0c;该模型的有效生成长度本质上受到监督微调(SFT) 期间看到的示例的限制。换句话说&#xff0c;这种输出限制源于现有 SFT 数…

搭建自己的GPT

搭建自己的GPT 文章说明核心代码效果展示源码下载 文章说明 目前GPT的使用比较主流&#xff0c;现有开源大模型&#xff0c;可以拉取到本地进行部署&#xff0c;搭建属于自己的GPT对话工具&#xff1b;主要用于熟悉大模型的本地搭建&#xff1b;本文采用开源的Ollama进行服务提…

Docker Desktop镜像路径修改一直报错

一 点击Apply & Restart报错 [Window Title] Docker Desktop[Main Instruction] Error migrating WSL disk[Content] An error occurred while migrating the Docker Desktop WSL data disk to its new location:moving disk file: rename C:\Users\Lenovo\AppData\Local\D…

equals ,hashcode ,== ,三者之间的关系与区别

为什么要重写 equals 和hashcode 在Java中&#xff0c;重写equals方法和hashCode方法是为了确保对象在逻辑上相等时&#xff0c;它们在集合&#xff08;如HashMap、HashSet&#xff09;中的行为也是一致的。 以下是详细解释&#xff1a; 为什么要重写 equals 方法 默认行为&a…

博弈论(Nim游戏的扩展)

公平组合游戏ICG 若一个游戏满足: 1.由两名玩家交替行动; 2.在游戏进程的任意时刻&#xff0c;可以执行的合法行动与轮到哪名玩家无关; 3.不能行动的玩家判负; 则称该游戏为一个公平组合游戏。 NIM博弈属于公平组合游戏&#xff0c;但城建的棋类游戏&#xff0c;比如围棋&…

Python算法工程师面试整理-概率与统计

1. 概率论 ● 基本概念: ○ 样本空间:所有可能结果的集合。 ○ 事件:样本空间的子集。 ○ 概率:事件发生的可能性,值在[0,1]之间。

【机器学习】实验设计之一次一因子方法(OFAT)、全因子设计方法(FFD)响应面方法(RSM)和插值方法以及如何选择控制因子的概念

引言 “一次一因子”&#xff08;One-Factor-At-a-Time&#xff0c;OFAT&#xff09;是一种经典的实验设计方法&#xff0c;用于分析模型中的每个输入因子&#xff08;特征或变量&#xff09;对响应变量&#xff08;目标或结果&#xff09;的影响 全因子设计&#xff08;Full F…

前端面试题 webpack的工作流程

一、流程图 二、重要概念 1.entry入口&#xff1a; Webpack 从配置的入口点开始&#xff0c;分析应用程序的依赖关系 2.output出口&#xff1a; 定义了打包后的文件如何输出&#xff0c;包括文件名和输出路径。 3.loader加载器&#xff1a; Webpack 本身只能处理 JavaScr…

扁形电容器与圆柱形电容器的性能区别

在现代电子设备中&#xff0c;电容器的角色不可或缺。它们不仅用于存储电能&#xff0c;还担负着过滤、耦合和阻抗匹配等多重功能。市场上主要有扁形电容器和圆柱形电容器两种类型&#xff0c;各自具备独特的优势和应用场景。 扁形电容器和圆柱形电容器在性能上存在显著差异&am…

Adobe Illustrator矢量绘图软件win/mac软件下载安装

一、软件概述 1.1 Adobe Illustrator简介 Adobe Illustrator是一款由Adobe Systems开发的强大矢量绘图软件&#xff0c;专为设计师、艺术家及图形专家设计。它广泛应用于平面设计、插画、UI设计、图标设计、排版及数字媒体制作等领域。Illustrator以其独特的矢量图形处理能力…