【BZOJ 1047】 [HAOI2007]理想的正方形
来源:互联网 发布:python参考手册 豆瓣 编辑:程序博客网 时间:2024/05/16 03:11
1047: [HAOI2007]理想的正方形
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1685 Solved: 891
[Submit][Status]
Description
有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小。
Input
第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。
Output
仅一个整数,为a*b矩阵中所有“n*n正方形区域中的最大整数和最小整数的差值”的最小值。
Sample Input
5 4 2
1 2 5 6
0 17 16 0
16 17 2 1
2 10 2 1
1 2 2 2
1 2 5 6
0 17 16 0
16 17 2 1
2 10 2 1
1 2 2 2
Sample Output
1
HINT
问题规模
(1)矩阵中的所有数都不超过1,000,000,000
(2)20%的数据2<=a,b<=100,n<=a,n<=b,n<=10
(3)100%的数据2<=a,b<=1000,n<=a,n<=b,n<=10
单调队列。
其实这道题比较简单,就是两次队列优化的dp。
g[i][j]表示在第j列,i-n+1到i的最小值。O(ab)可求出。
f[i][j]表示以(i,j)为右下角n*n的矩阵中的最小值,用g[i][j]来求,就转变成一维的了。O(ab)可求出。
最大最小就是分别按照正负来做即可。
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cstdlib>#define inf 0x3f3f3f3fusing namespace std;int a,b,n,g[1005][1005],f[1005][1005][2],x[1005][1005];struct qu{int v,p;}q[1005];void Getgf(int k){for (int j=1;j<=b;j++){int l=1,r=0;for (int i=1;i<=a;i++){while (r&&r>=l&&x[i][j]<=q[r].v) r--;while (l&&l<=r&&q[l].p<=i-n)l++;q[++r].v=x[i][j],q[r].p=i;g[i][j]=q[l].v;}}for (int i=n;i<=a;i++){int l=1,r=0;for (int j=1;j<=b;j++){while (r&&r>=l&&g[i][j]<=q[r].v) r--;while (l&&l<=r&&q[l].p<=j-n)l++;q[++r].v=g[i][j],q[r].p=j;f[i][j][k]=q[l].v;}}}int main(){ scanf("%d%d%d",&a,&b,&n);for (int i=1;i<=a;i++)for (int j=1;j<=b;j++)scanf("%d",&x[i][j]);Getgf(0);for (int i=1;i<=a;i++)for (int j=1;j<=b;j++)x[i][j]=-x[i][j];Getgf(1);int ans=inf;for (int i=n;i<=a;i++)for (int j=n;j<=b;j++)ans=min(ans,-f[i][j][1]-f[i][j][0]);cout<<ans<<endl;return 0;}
感悟:
1.这道题本质就是把二维的问题转化成一维的来做
2 1
- BZOJ 1047: [HAOI2007]理想的正方形
- BZOJ 1047: [HAOI2007]理想的正方形
- 【BZOJ 1047】 [HAOI2007]理想的正方形
- BZOJ 1047 [HAOI2007]理想的正方形
- [BZOJ]1047: [HAOI2007]理想的正方形
- BZOJ 1047: [HAOI2007]理想的正方形
- BZOJ 1047: [HAOI2007]理想的正方形
- bzoj 1047: [HAOI2007]理想的正方形
- [bzoj-1047][HAOI2007]理想的正方形 题解
- BZOJ 1047 [HAOI2007]理想的正方形
- 1047: [HAOI2007]理想的正方形
- 1047: [HAOI2007]理想的正方形
- 1047: [HAOI2007]理想的正方形
- BZOJ 1047 HAOI2007 理想的正方形 单调队列
- bzoj 1047 [HAOI2007]理想的正方形 单调队列
- bzoj 1047: [HAOI2007]理想的正方形 (单调队列)
- BZOJ 1047 [HAOI2007]理想的正方形【单调队列
- BZOJ 1047 [HAOI2007]理想的正方形 二维ST表+压维
- FileInputStream、FileOutputStream的应用
- vb.net正则表达式快速入门(1)
- 【Java】线程并发、互斥与同步
- LeetCode OJ 之 Permutation Sequence (排列组合)
- ⑦--OC核心语法
- 【BZOJ 1047】 [HAOI2007]理想的正方形
- 全志行车记录仪里面FireEyepublic.apk反编译的分析(四)——Handler分析
- 关于ubuntu14.04 LTS下apache2路由重写设置,设置虚拟域名
- Creating a custom ViewGroup(自定义ViewGroup)
- jQuery的animate() 函数不支持backgroundPosition的解决方法
- 2015,送给你!
- 实训
- Axure如何建立共享项目、如何编辑共享项目、如何获取共享项目
- eclipse下搜索关键字报错