Luogu 2216[HAOI2007]理想的正方形 - 单调队列
Solution
二维单调队列, 这个数组套起来看得我眼瞎。。。
Code
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- #define rd read()
- #define rep(i,a,b) for(register int i = (a); i <= (b); ++i)
- #define per(i,a,b) for(register int i = (a); i >= (b); --i)
- #define Lb lb[i]
- #define Rb rb[i]
- #define Ls ls[i]
- #define Rs rs[i]
- using namespace std;
- const int N = 1e3 + ;
- const int inf = ~0U >> ;
- int n, m, len, a[N][N];
- int qb[N][N], lb[N], rb[N];
- int qs[N][N], ls[N], rs[N];
- int qB[N], LB, RB;
- int qS[N], LS, RS;
- int ans = inf;
- int read() {
- int X = , p = ; char c = getchar();
- for(; c > '' || c < ''; c = getchar()) if(c == '-') p = -;
- for(; c >= '' && c <= ''; c = getchar()) X = X * + c - '';
- return X * p;
- }
- int main()
- {
- n = rd; m = rd; len = rd;
- rep(i, , n) rep(j, , m) a[i][j] = rd;
- rep(i, , n) ls[i] = lb[i] = ;
- rep(j, , m) {
- rep(i, , n) {
- while(qb[i][Lb] <= j - len && Lb <= Rb) Lb++;
- while(qs[i][Ls] <= j - len && Ls <= Rs) Ls++;
- while(Lb <= Rb && a[i][qb[i][Rb]] <= a[i][j]) Rb--;
- while(Ls <= Rs && a[i][qs[i][Rs]] >= a[i][j]) Rs--;
- qb[i][++Rb] = j;
- qs[i][++Rs] = j;
- }
- LS = LB = ;
- RB = RS = ;
- if(j >= len)
- rep(i, , n) {
- while(qB[LB] <= i - len && LB <= RB) LB++;
- while(qS[LS] <= i - len && LS <= RS) LS++;
- while(LB <= RB && a[qB[RB]][qb[qB[RB]][lb[qB[RB]]]] <= a[i][qb[i][Lb]]) RB--;
- while(LS <= RS && a[qS[RS]][qs[qS[RS]][ls[qS[RS]]]] >= a[i][qs[i][Ls]]) RS--;
- qB[++RB] = i;
- qS[++RS] = i;
- int hb = qB[LB], hs = qS[LS];
- if(i >= len) ans = min(ans, a[hb][qb[hb][lb[hb]]] - a[hs][qs[hs][ls[hs]]]);
- }
- }
- printf("%d\n", ans);
- }
Luogu 2216[HAOI2007]理想的正方形 - 单调队列的更多相关文章
- [Luogu 2216] [HAOI2007]理想的正方形
[Luogu 2216] [HAOI2007]理想的正方形 题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输 ...
- BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2857 Solved: 1560[Submit][St ...
- bzoj 1047 : [HAOI2007]理想的正方形 单调队列dp
题目链接 1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2369 Solved: 1266[Submi ...
- BZOJ 1047: [HAOI2007]理想的正方形( 单调队列 )
单调队列..先对每一行扫一次维护以每个点(x, y)为结尾的长度为n的最大最小值.然后再对每一列扫一次, 在之前的基础上维护(x, y)为结尾的长度为n的最大最小值. 时间复杂度O(ab) (话说还是 ...
- P2216 [HAOI2007]理想的正方形 (单调队列)
题目链接:P2216 [HAOI2007]理想的正方形 题目描述 有一个 \(a\times b\)的整数组成的矩阵,现请你从中找出一个 \(n\times n\)的正方形区域,使得该区域所有数中的最 ...
- Luogu 2216 [HAOI2007]理想的正方形 (单调队列优化)
题意: 给出一个 N×M 的矩阵,以及一个数值 K ,求在给定的矩阵中取出一个 K×K 的矩阵其中最大值减去最小值的最小值. 细节: 没有细节来发暴力走天下,20分也是分啊~~~ QAQ. 分析: 感 ...
- BZOJ 1047: [HAOI2007]理想的正方形 单调队列瞎搞
题意很简明吧? 枚举的矩形下边界和右端点即右下角,来确定矩形位置: 每一个纵列开一个单调队列,记录从 i-n+1 行到 i 行每列的最大值和最小值,矩形下边界向下推移的时候维护一下: 然后在记录的每一 ...
- [HAOI2007] 理想的正方形 (单调队列)
题目链接 Solution MD,经过这道题,算是掌握单调队列了... 可以先预处理出点 \((i,j)\) 往上 \(n\) 的最大值和最小值. 然后再横着做一遍单调队列即可. Code #incl ...
- 洛谷P2216: [HAOI2007]理想的正方形 单调队列优化DP
洛谷P2216 )逼着自己写DP 题意: 给定一个带有数字的矩阵,找出一个大小为n*n的矩阵,这个矩阵中最大值减最小值最小. 思路: 先处理出每一行每个格子到前面n个格子中的最大值和最小值.然后对每一 ...
随机推荐
- java-学习1
作为一个想要深入的程序猿,只是学习前端是不够的,我总结我的前端工作是围绕着html.css.js展开写的再好也是展现在表面,所以 我想学习一门能够深入的后台语言,想来想去我还是选择java作为以后深入 ...
- linux下面设置密码失效参考
chage -E 2005-12-31 user1 设置用户口令的失效期限
- Centos7 安装 erlang rabbitmq
1.安装Erlang依赖采用官网的rpm包的形式进行安装,不采用yum(由系统进行自动安装 可能因为版本低的问题而出现一系列问题) erlang依赖 rpm包下载地址https://github.co ...
- Typechecking With PropTypes
[Typechecking With PropTypes] 1.props类型检查 React has some built-in typechecking abilities. To run typ ...
- 解题4(NumberToEnglish )
题目描述 Jessi初学英语,为了快速读出一串数字,编写程序将数字转换成英文: 如22:twenty two,123:one hundred and twenty three. 说明: 数字为正整数, ...
- GsonFormat的使用 (转)
一.Android Studio快速添加Gson 具体操作: 1.File->Project Structure: 2.app->Dependencies->&qu ...
- PyCon大会Python主题演讲摘要
PyCon 是全国际最大的以 Python 编程言语 为主题的技能大会.大会由 Python 社区组织,每年举行一次.在大会上,来自国际各地的 Python 用户与中心开发者齐聚一堂,共同同享 Pyt ...
- Java Web开发和Python Web开发之间的区别
今天的文章讨论了Java Web开发和Python Web开发之间的区别.我不鼓励我们在这里从Java Web迁移到Python Web开发.我只是想谈谈我的感受.它不一定适合所有情况,仅供我们参考. ...
- 第十一章 串 (c2)KMP算法:查询表
- SSH 连接很慢
相信很多朋友在使用Linux系统的时候因为安全性的原因摒弃了telnet rlogin 或者 X-window,而把openssh作为自己默认的远程登录方式.然而经常会遇到的一个情况是telnet到s ...