一维和二维ST模板
void init(){
for (int i = ; i < n; i++) st[i][] = a[i];
for (int j = ; ( << j) <= n; j++){
for (int i = ; i + ( << j) - < n; i++){
st[i][j] = min(st[i + ( << (j-))][j - ], st[i][j - ]);
}
}
}
inline int query(int l, int r){
int len = r - l + ;
int k = ;
while (( << (k + )) <= len) k++;
return min(st[l][k], st[r - ( << k) + ][k]);
}
二维:
定义dp(i, j, k, L)表示以(i,j)为左上角,宽度为(2^k, 2^L)的区间内的某个数值
int dp[maxn][maxn][][], dp2[maxn][maxn][][];
void init_st(){
for (int i = ; ( << i) <= n; i++){
for (int j = ; ( << j) <= n; j++){
if (i == && j == ) continue;
for (int x = ; x + ( << i) - <= n; x++){
for (int y = ; y + ( << j) - <= n; y++){
if (i == ) {
dp[x][y][i][j] = min(dp[x][y][i][j - ], dp[x][y + ( << (j - ))][i][j - ]);
dp2[x][y][i][j] = max(dp2[x][y][i][j - ], dp2[x][y + ( << (j - ))][i][j - ]);
}
else {
dp[x][y][i][j] = min(dp[x][y][i - ][j], dp[x + ( << (i - ))][y][i - ][j]);
dp2[x][y][i][j] = max(dp2[x][y][i - ][j], dp2[x + ( << (i - ))][y][i - ][j]);
}
}
}
}
}
}
int query(int x, int y, int X, int Y){
int maxi = , mini = 1e8;
int k1 = , k2 = ;
while ( << ( + k1) <= X - x) k1++;
while ( << ( + k2) <= Y - y) k2++;
maxi = max(maxi, max(dp2[x][y][k1][k2], dp2[X - ( << k1) + ][y][k1][k2]));
maxi = max(maxi, max(dp2[x][Y - ( << k2) + ][k1][k2], dp2[X - ( << k1) + ][Y - ( << k2) + ][k1][k2]));
mini = min(mini, min(dp[x][y][k1][k2], dp[X - ( << k1) + ][y][k1][k2]));
mini = min(mini, min(dp[x][Y - ( << k2) + ][k1][k2], dp[X - ( << k1) + ][Y - ( << k2) + ][k1][k2]));
//printf("maxi = %d mini = %d\n", maxi, mini);
return maxi - mini;
}
一维和二维ST模板的更多相关文章
- [模板]二维ST表
考试yy二维ST表失败导致爆零. 其实和一维的ST表很像... 也是设$f[i][j][p][q]$为以$(i, j)$为左上角,长为$2^p$,宽为$2^q$的矩形的最大值. 算法流程是先把每一行都 ...
- thinkphp二维数组模板输出方法
thinkphp二维数组模板输出方法 先写个记录,有空再整理发上来
- 二维 ST POJ 2019
题目大意:给你一个n*n的矩阵,每次给你一个点(x,y),以其为左上角,宽度为b的矩阵中最小的数值和最大数值的差是多少? 一共k个询问. 思路:简单的二维st. 定义dp(i,j,k,L)表示以(i ...
- BZOJ3577:玩手机(最大流,二维ST表)
Description 现在有一堆手机放在坐标网格里面(坐标从1开始),坐标(i,j)的格子有s_(i,j)个手机. 玩手机当然需要有信号,不过这里的手机与基站与我们不太一样.基站分为两种:发送站和接 ...
- BZOJ1047[HAOI2007]理想的正方形——二维ST表
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非 ...
- 【CodeForces】713 D. Animals and Puzzle 动态规划+二维ST表
[题目]D. Animals and Puzzle [题意]给定n*m的01矩阵,Q次询问某个子矩阵内的最大正方形全1子矩阵边长.n,m<=1000,Q<=10^6. [算法]动态规划DP ...
- 【洛谷 P2216】 [HAOI2007]理想的正方形(二维ST表)
题目链接 做出二维\(ST\)表,然后\(O(n^2)\)扫一遍就好了. #include <cstdio> #include <cstring> #include <a ...
- Codeforces 713D Animals and Puzzle(二维ST表+二分答案)
题目链接 Animals and Puzzle 题意 给出一个1e3 * 1e3的01矩阵,给出t个询问,每个询问形如x1,y1,x2,y2 你需要回答在以$(x1, y1)$为左上角,$(x1, ...
- [HNOI2007] 理想正方形 二维ST表
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至 ...
随机推荐
- echarts的pie图中,各区块颜色的调整
今天在学习使用echarts生成各种图表. 然后在使用pie图时出现我无论怎么更改代码中的颜色,pie图中各块的颜色都十分相近,几乎没法区别块与块之间的区别,如下图: 在下图中,除了其中一块的是红色的 ...
- 命令行下对apk签名
l创建key,需要用到keytool.exe (位于jdk安装目录\bin目录下),使用产生的key对apk签名用到的是jarsigner.exe (位于jdk安装目录\bin目录下),把上两个软件所 ...
- (Python爬虫01)-本想给随笔加个序号才发现这么不方便
本想给随机加个序号,才发现还得去返回看看文章的序号.好在cnblog能断点自动保存. 作为一个小程序员,点赞的同时还在想,谁知道咋实现这种实时保存呢?有知道的给个参考文档呗.太感激了! 重点在这里 有 ...
- 洛谷P2346四子连棋
题目描述 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步. 黑白双方交替走棋,任意一方可 ...
- Nginx 配置 HTTPS自签名证书
工具: OpenSSL ssl的开源实现,几乎实现了市面上所有的加密 libcrypto: 通用加密库, 任何软件要实现加密功能 链接调用这个库 libssl: TLS/SSL 加密库 openssl ...
- [nginx] OpenResty 学习手册
OpenResty Installation Find tar.gz : https://openresty.org/cn/download.html tar -xzvf openresty-VERS ...
- URAL 1932 The Secret of Identifier(容斥)
Description Davy Jones: You've been captain of the Black Pearl for 13 years. That was our agreement. ...
- Alpha 冲刺5/10
队名:我头发呢队 组长博客 杰(组长) 过去两天完成了哪些任务 继续翻阅Material Design2文档 翻阅网易云的web端网页 接下来的计划 音源爬取 还剩下哪些任务 app开发 燃尽图 有哪 ...
- 微信公众号开发java框架:wx4j(MaterialUtils篇)
wx4j-MaterialUtils的使用 函数说明:上传永久视频素材 参数:文件路径.视频描述(通过setter填充内容即可) 返回值:微信服务器返回的json字符串 public static S ...
- DPDK 网卡RSS(receive side scaling)简介
网卡RSS(receive side scaling)简介 RSS是一种网卡驱动技术,能让多核系统中跨多个处理器的网络收包处理能力高效能分配.注意:由于同一个核的处理器超线程共享同一个执行引擎,这个效 ...