POJ 3264
rmq算法的模板题,同时求区间内的最大最小值
#include<iostream> #include<cmath> #include<cstdio> using namespace std; int a[500086]; int mx[500086][20],mi[500086][20]; void rmqinit(int n) { for(int i=1;i<=n;i++){ mi[i][0]=mx[i][0]=a[i]; } int m=log(1.0*n)/log(2.0); for(int j=1;j<=m;j++){ for(int i=n;i>=1;i--){ mx[i][j]=mx[i][j-1]; if(i+(1<<(j-1))<=n){ mx[i][j]=max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]); } mi[i][j]=mi[i][j-1]; if(i+(1<<(j-1))<=n){ mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]); } } } } int rmqmax(int l,int r) { int m=log(1.0*r-l+1)/log(2.0); return max(mx[l][m],mx[r-(1<<m)+1][m]); } int rmqmin(int l,int r) { int m=log(1.0*r-l+1)/log(2.0); return min(mi[l][m],mi[r-(1<<m)+1][m]); } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } rmqinit(n); int l,r; for(int i=1;i<=m;i++){ scanf("%d%d",&l,&r); printf("%d\n",rmqmax(l,r)-rmqmin(l,r)); } }
如需转载,请注明出处
如有侵权,联系删除
2290713181@qq.com
如有侵权,联系删除
2290713181@qq.com
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
· 程序员常用高效实用工具推荐,办公效率提升利器!