bzoj 1047 单调队列
做4次单调队列优化DP。
/**************************************************************
Problem: 1047
User: idy002
Language: C++
Result: Accepted
Time:2088 ms
Memory:16756 kb
****************************************************************/ #include <cstdio>
#define N 1010 struct Pair {
int i, j, v;
Pair(){}
Pair( int i, int j, int v ):i(i),j(j),v(v){}
}; int n, m, r, ans;
int v[N][N], dp[N][N], dmin[N][N], dmax[N][N];
Pair qu[N]; int bg, ed; int dodp() {
// min
for( int i=; i<=n; i++ ) {
bg=, ed=;
for( int j=; j<=m; j++ ) {
while( bg<=ed && qu[bg].j<j-r+ ) bg++;
while( bg<=ed && qu[ed].v>v[i][j] ) ed--;
qu[++ed] = Pair(i,j,v[i][j]);
dp[i][j] = qu[bg].v;
}
}
for( int j=; j<=m; j++ ) {
bg=, ed=;
for( int i=; i<=n; i++ ) {
while( bg<=ed && qu[bg].i<i-r+ ) bg++;
while( bg<=ed && qu[ed].v>dp[i][j] ) ed--;
qu[++ed] = Pair(i,j,dp[i][j]);
dmin[i][j] = qu[bg].v;
}
}
// max
for( int i=; i<=n; i++ ) {
bg=, ed=;
for( int j=; j<=m; j++ ) {
while( bg<=ed && qu[bg].j<j-r+ ) bg++;
while( bg<=ed && qu[ed].v<v[i][j] ) ed--;
qu[++ed] = Pair(i,j,v[i][j]);
dp[i][j] = qu[bg].v;
}
}
for( int j=; j<=m; j++ ) {
bg=, ed=;
for( int i=; i<=n; i++ ) {
while( bg<=ed && qu[bg].i<i-r+ ) bg++;
while( bg<=ed && qu[ed].v<dp[i][j] ) ed--;
qu[++ed] = Pair(i,j,dp[i][j]);
dmax[i][j] = qu[bg].v;
}
}
int ans = ;
for( int i=r; i<=n; i++ )
for( int j=r; j<=m; j++ ) {
int tans = dmax[i][j]-dmin[i][j];
if( ans>tans ) ans=tans;
}
/* debug
fprintf( stderr, "n=%d m=%d r=%d\n", n, m, r );
fprintf( stderr, "v:\n" );
for( int i=1; i<=n; i++ ) {
for( int j=1; j<=m; j++ )
fprintf( stderr, "%2d ", v[i][j] );
fprintf( stderr, "\n" );
}
fprintf( stderr, "dmin:\n" );
for( int i=1; i<=n; i++ ) {
for( int j=1; j<=m; j++ )
fprintf( stderr, "%2d ", dmin[i][j] );
fprintf( stderr, "\n" );
}
fprintf( stderr, "dmax:\n" );
for( int i=1; i<=n; i++ ) {
for( int j=1; j<=m; j++ )
fprintf( stderr, "%2d ", dmax[i][j] );
fprintf( stderr, "\n" );
}
*/
return ans;
}
int main() {
scanf( "%d%d%d", &n, &m, &r );
for( int i=; i<=n; i++ )
for( int j=; j<=m; j++ )
scanf( "%d", &v[i][j] );
printf( "%d\n", dodp() );
}
bzoj 1047 单调队列的更多相关文章
- BZOJ 4385 单调队列
思路: 对于每一个r 要找最小的符合条件的l最优 这时候就要找在这个区间中 d长度的和的最大值 用单调队列更新就好了 //By SiriusRen #include <cstdio> #i ...
- bzoj 3126 单调队列优化dp
能转移的最左是其左边完整区间的最右左端点,最右是能覆盖它的最左左端点-1 #pragma GCC optimize ("O3") #include<cstdio> #i ...
- BZOJ 3831 单调队列DP
思路: 这好像是我刚学单调性的时候做的题 (我是不会告诉你 我被这题教做人了的...) i-stk[head]>k 删队头 f[stk[tail]]>f[i]||(f[stk[tail]] ...
- BZOJ 2096 单调队列
思路: 偷懒用的STL //By SiriusRen #include <deque> #include <cstdio> using namespace std; struc ...
- BZOJ 1012 单调队列+二分
思路: 维护一个单减的序列 序号是单增的 每回二分查找第一个比询问的大的值 我手懒 用得lower_bound //By SiriusRen #include <cstdio> #incl ...
- [BZOJ 1047] [HAOI2007] 理想的正方形 【单调队列】
题目链接:BZOJ - 1047 题目分析 使用单调队列在 O(n^2) 的时间内求出每个 n * n 正方形的最大值,最小值.然后就可以直接统计答案了. 横向有 a 个单调队列(代码中是 Q[1] ...
- BZOJ 1047 二维单调队列
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 题意:见中文题面 思路:该题是求二维的子矩阵的最大值与最小值的差值尽量小.所以可以考 ...
- BZOJ 1047 理想的正方形(单调队列)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1047 题意:给出一个n*m的矩阵.在所有K*K的子矩阵中,最大最小差值最小的是多少? 思 ...
- bzoj 1047 : [HAOI2007]理想的正方形 单调队列dp
题目链接 1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2369 Solved: 1266[Submi ...
随机推荐
- 10 Useeful Tips for Writing Effective Bash Scripts in Linux
1.Always Use Comments in Scripts2.Make a Scripts exit When Fails Sometimes bash may continue to e ...
- aarch64_g1
GAPDoc-1.5.1-12.fc26.noarch.rpm 2017-02-14 07:37 1.0M fedora Mirroring Project GAPDoc-latex-1.5.1-12 ...
- lucene-利用内存中索引和多线程提高索引效率
转载地址: http://hi.baidu.com/idoneing/item/bc1cb914521c40603e87ce4d 1.RAMDirectory和FSDirectory对比 RAMDir ...
- java jps命令使用解析
在linux环境下显示一个进程的信息大家可能一直都在使用ps命令,比如用以下命令来显示当前系统执行的java进程: ps -ef | grep java 针对java的进程,jdk1.5以后提供了一个 ...
- 消息 8101,级别 16,状态 1,第 1 行仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'CUSTOMER_TBL'中的标识列指定显式值。
像这样的问题怎么解决呢? 问题分析: 意思是你的主键是自动编号类型的,所以不能向该列插入数据. 解决办法: 执行 语句 :SET IDENTITY_INSERT CUSTOMER_TBL ON 然后在 ...
- MyBatis的动态插入语句(经常报‘无效的列类型’)
最近在工作中经常遇到一个情况:通过mybatis的标签执行插入语句,当表中字段比较多的时候,需要全部插入,而有时候的需求是只插入其中几个字段,但是会报错. 原来的语句,必须把所有字段都Set值. &l ...
- 实战MEF(1)一种不错的扩展方式
在过去,我们完成一套应用程序后,如果后面对其功能进行了扩展或修整,往往需要重新编译代码生成新的应用程序,然后再覆盖原来的程序.这样的扩展方式对于较小的或者不经常扩展和更新的应用程序来说是可以接受的,而 ...
- JavaScript中的数据结构及实战系列
本系列主要是讲解JavaScript中的数据结构及在实际项目中遇到的地方 JavaScript中的数据结构及实战系列(1):队列 JavaScript中的数据结构及实战系列(2):栈
- Java第三阶段学习(三、字符流、转换流)
一.字节流读取中文时出现的问题: 文件中有中文时,用字节流读取会出现乱码的问题,因为一个中文为两个字节. 二.字符编码表 编码表:其实就是生活中字符和计算机二进制的对应关系表. 1.ascii: 一个 ...
- Python学习笔记之爬虫
爬虫调度端:启动爬虫,停止爬虫,监视爬虫运行情况 URL管理器:对将要爬取的和已经爬取过的URL进行管理:可取出带爬取的URL,将其传送给“网页下载器”网页下载器:将URL指定的网页下载,存储成一个字 ...