二维ST表
时间:2019-08-21
本文章向大家介绍二维ST表,主要包括二维ST表使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
二维ST表
既然查询对象是个二维矩阵,那么我们能不能维护一个二维的ST STST表呢?答案显然是肯定的。
预处理:
我们让 dp[i][j][k][l] 为新的ST表,表示以 (i,j) 为左上角,右下角为 (i + 2^k -1 , j + 2^l - 1) 的矩阵中的最大值,那么我们可以看出预处理的复杂度是O(nmlognlogm)
我们来看对于每一个dp[i][j][k][l] 可以又哪些状态更新:
下图是一个矩阵:
我们假设这个矩阵的左上角是 (i,j) 右下角是 (i + 2^k - 1,j + 2^l - 1)
我们把这个矩阵分成两个部分:
查询:
对于一个子矩阵,我们假设它的左上角的坐标为 (x1,y1) , 右下角为 (x2,y2) 那么可以通过预处理得到二维ST表,将其分为四部分查询
1 #include<iostream> 2 #include<cstdio> 3 #include<string.h> 4 #include<string> 5 #include<stack> 6 #include<set> 7 #include<algorithm> 8 #include<cmath> 9 #include<vector> 10 #include<map> 11 12 13 #define ll __int64 14 #define lll unsigned long long 15 #define MAX 1000009 16 #define eps 1e-8 17 18 using namespace std; 19 /* 20 二维RMQ模板题 21 同一维一样 用dp[row][col][i][j]表示(row,col)到(row+2^i,col+2^j)矩形内的最小值 22 查询 23 */ 24 25 int mapp[309][309]; 26 int dp[309][309][9][9]; 27 int flag; 28 29 void RMQ_init2d(int m,int n) 30 { 31 for(int i=1; i<=m; i++) 32 { 33 for(int j = 1; j<=n; j++) 34 { 35 dp[i][j][0][0] = mapp[i][j]; 36 } 37 } 38 int t = log((double)n) / log(2.0); 39 40 for(int i = 0; i<=t; i++) 41 { 42 for(int j = 0; j<=t; j++) 43 { 44 if(i==0&&j==0) 45 continue; 46 for(int row = 1; row+(1<<i)-1<= m; row++) 47 { 48 for(int col = 1; col+(1<<j)-1<= n; col++) 49 { 50 if(i) 51 dp[row][col][i][j] = max(dp[row][col][i-1][j],dp[row+(1<<(i-1))][col][i-1][j]); 52 else 53 dp[row][col][i][j] = max(dp[row][col][i][j-1],dp[row][col+(1<<(j-1))][i][j-1]); 54 } 55 } 56 } 57 } 58 } 59 int RMQ_2d(int x1,int y1,int x2,int y2) 60 { 61 int k1 = log(double(x2 - x1 + 1)) / log(2.0); 62 int k2 = log(double(y2 - y1 + 1)) / log(2.0); 63 int m1 = dp[x1][y1][k1][k2]; 64 int m2 = dp[x2 - (1<<k1) + 1][y1][k1][k2]; 65 int m3 = dp[x1][y2 - (1<<k2) + 1][k1][k2]; 66 int m4 = dp[x2 - (1<<k1) + 1][y2 - (1<<k2) + 1 ][k1][k2]; 67 int _max = max(max(m1,m2),max(m3,m4)); 68 if(mapp[x1][y1]==_max||mapp[x1][y2]==_max||mapp[x2][y1]==_max||mapp[x2][y2]==_max) 69 flag = 1; 70 return _max; 71 } 72 73 int main() 74 { 75 int n,m,t; 76 int x1,x2,y1,y2; 77 while(~scanf("%d%d",&m,&n)) 78 { 79 for(int i = 1; i<=m; i++) 80 { 81 for(int j = 1; j<=n; j++) 82 { 83 scanf("%d",&mapp[i][j]); 84 } 85 } 86 RMQ_init2d(m,n); 87 scanf("%d",&t); 88 while(t--) 89 { 90 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 91 92 flag = 0; 93 int _max = RMQ_2d(x1,y1,x2,y2); 94 if(flag == 1) 95 printf("%d yes\n",_max); 96 else 97 printf("%d no\n",_max); 98 } 99 } 100 return 0; 101 }
原文地址:https://www.cnblogs.com/-Ackerman/p/11387105.html
- Apache solr(一).
- dataguard中MRP无法启动的问题分析和解决(r5笔记第82天)
- Apache solr(二).
- Git 使用技巧
- 4.训练模型之准备训练数据
- 关于dg broker的简单配置(r5笔记第99天)
- 三天速成 TensorFlow课件分享
- 干货 | 机器学习算法线上部署方法
- 用于快速开发 3D 数据处理软件的开源数据处理库 —— Open3D | Github 项目推荐
- 【java网络】IO编程
- 一周 Github Trending 热门项目,最全中华古诗词数据库 | Github 项目推荐
- 【线程池】线程池与工作队列
- 一个快速方便的图形化 Python 调试器 —— birdseye | Github 项目推荐
- 关于分区表的在线重定义(r5笔记第98天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 这3个Scikit-learn的特征选择技术,能够有效的提高你的数据预处理能力
- 使用神经网络解决拼图游戏
- 用机器学习预测收益
- 一种基于深度学习的低成本细胞生物学研究方法
- 从零搭建Spring Boot脚手架(2):增加通用的功能
- Qt官方示例-K线图
- 一个快速构造GAN的教程:如何用pytorch构造DCGAN
- 从0到1开发测试平台(八)后端服务添加lombok第三方类库
- 【CSS】470- 是时候开始用 CSS 自定义属性了
- 一个安卓App,如何成为DuerOS 上的技能应用呢?
- 什么是SPU、SKU、SKC、ARPU
- C++判断类型的模板
- 强化学习/增强学习/再励学习介绍 | 深度学习 | 干货分享 | 解读技术
- Spring Security 初始化流程梳理
- 聊聊dubbo-go的kubernetesRegistry