BZOJ1047
来源:互联网 发布:淘宝可以不交保证金吗 编辑:程序博客网 时间:2024/06/06 02:50
传送门:BZOJ1047
我们用f(i,j)表示第j列上区间[max(i-n+1,1),i]的最小值。
这一步的转移可以用单调队列来完成。
然后,我们用g(i,j)来表示以点(i,j)为右下角的边长为n的正方形中元素的最小值。
转移是:g(i,j)=min:f(i,j’),j’∈[max(j-n+1,1),j],于是它也可以用一个单调队列来优化。
注意细节。
代码上的小细节见下。
#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <algorithm>#include <iostream>#include <queue>using namespace std;const int INF=0x3f3f3f3f;deque<int> Q;int f[1005][1005];int g[1005][1005];int r[1005][1005];int map[1005][1005];int a,b,n;void First_min(){ for(int i=1;i<=a;i++){ for(int j=1;j<=b;j++){ f[i][j]=map[i][j]; if(!Q.empty()){ f[i][j]=min(f[i][j],map[i][Q.front()]); if(j-Q.front()+1>=n) Q.pop_front(); } while(!Q.empty()&&map[i][Q.back()]>=map[i][j]) Q.pop_back(); Q.push_back(j); } while(!Q.empty()) Q.pop_back(); } for(int j=1;j<=b;j++){ for(int i=1;i<=a;i++){ g[i][j]=f[i][j]; if(!Q.empty()){ g[i][j]=min(g[i][j],f[Q.front()][j]); if(i-Q.front()+1>=n) Q.pop_front(); } while(!Q.empty()&&f[Q.back()][j]>=f[i][j]) Q.pop_back(); Q.push_back(i); } while(!Q.empty()) Q.pop_back(); }}void First_max(){ for(int i=1;i<=a;i++){ for(int j=1;j<=b;j++){ f[i][j]=map[i][j]; if(!Q.empty()){ f[i][j]=max(f[i][j],map[i][Q.front()]); //printf("%d %d %d\n",i,j,Q.front()); if(j-Q.front()+1>=n) Q.pop_front(); } while(!Q.empty()&&map[i][Q.back()]<=map[i][j]) Q.pop_back(); Q.push_back(j); } while(!Q.empty()) Q.pop_back(); } for(int j=1;j<=b;j++){ for(int i=1;i<=a;i++){ r[i][j]=f[i][j]; if(!Q.empty()){ r[i][j]=max(r[i][j],f[Q.front()][j]); if(i-Q.front()+1>=n) Q.pop_front(); } while(!Q.empty()&&f[Q.back()][j]<=f[i][j]) Q.pop_back(); Q.push_back(i); } while(!Q.empty()) Q.pop_back(); }}void Solve(){ int ans=INF; for(int i=1;i<=a;i++) for(int j=1;j<=b;j++) if(i>=n&&j>=n) ans=min(ans,r[i][j]-g[i][j]); printf("%d\n",ans);}void Readdata(){ freopen("loli.in","r",stdin); scanf("%d%d%d",&a,&b,&n); for(int i=1;i<=a;i++) for(int j=1;j<=b;j++) scanf("%d",&map[i][j]);}void Close(){ fclose(stdin); fclose(stdout);}int main(){ Readdata(); First_min(); First_max(); Solve(); Close(); return 0;}
0 0
- BZOJ1047
- BZOJ1047
- bzoj1047
- BZOJ1047
- Bzoj1047理想的正方形
- bzoj1047【haoi2007】理想正方形
- bzoj1047 理想的正方形
- BZOJ1047 理想的正方形
- bzoj1047理想的正方形
- bzoj1047 单调队列
- 【BZOJ1047 || HAOI2007】理想的正方形
- BZOJ1047 HAOI2007 理想的正方形
- [BZOJ1047][HAOI2007]理想的正方形
- bzoj1047&CodeVS1715 理想的正方形
- BZOJ1047: [HAOI2007]理想的正方形
- [BZOJ1047][HAOI2007]理想的正方形
- BZOJ1047: [HAOI2007]理想的正方形
- bzoj1047: [HAOI2007]理想的正方形
- StringBuffer
- 布局,全屏,横屏竖屏
- 博弈知识汇总(转)
- Android Api Demos登顶之路(三十八)Fragment-->Dialog or Activity
- Java中的深拷贝和浅拷贝介绍
- BZOJ1047
- hibernate教程3之Hibernate映射申明(Mapping declaration)
- 【分享】姉、ちゃんとしようよっ!1+2【日文硬盘版】[带全CG存档&攻略+免安装&卸载补丁+日本语启动补丁&自动设置打开AGTH和Cp2Tran补丁★]
- 严格模式和混杂模式
- UITableViewController
- 放弃一切
- 基本算法复习之递归:经典问题举例
- 最长公共子串的长度(阿里)
- 各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)