bzoj1047: [HAOI2007]理想的正方形(單調佇列)
題目傳送門
水一發。
解法:
分最大值和最小值咯。
然後hang[i][j]表示第i行以j結尾往前數n個的最大值或最小值。
做完行之後做列。
lie[i][j]表示以(i,j)為右下角的n*n的矩陣的最大值或最小值。
跑兩次單調佇列就行了呀。。
程式碼實現:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
int head,tail,list[1100];
int map[1100][1100],hang_mx[1100][1100],lie_mx[1100][1100],hang_mn[1100][1100],lie_mn[1100][1100];
int main() {
int a,b,n;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]);
for(int i=1;i<=a;i++) {
head=1;tail=1;list[1]=1;
for(int j=2;j<n;j++) {
while(head<=tail&&map[i][j]>=map[i][list[tail]])tail--;
list[++tail]=j;
}
for(int j=n;j<=b;j++) {
while(head<=tail&&map[i][j]>=map[i][list[tail]])tail--;
list[++tail]=j;
while(head<tail&&list[head]<j-n+1)head++;
hang_mx[i][j]=map[i][list[head]];
}
head=1;tail=1;list[1]=1;
for(int j=2;j<n;j++) {
while(head<=tail&&map[i][j]<=map[i][list[tail]])tail--;
list[++tail]=j;
}
for(int j=n;j<=b;j++) {
while(head<=tail&&map[i][j]<=map[i][list[tail]])tail--;
list[++tail]=j;
while(head<tail&&list[head]<j-n+1)head++;
hang_mn[i][j]=map[i][list[head]];
}
}
for(int j=n;j<=b;j++) {
head=1;tail=1;list[1]=1;
for(int i=2;i<n;i++) {
while(head<=tail&&hang_mx[i][j]>=hang_mx[list[tail]][j])tail--;
list[++tail]=i;
}
for(int i=n;i<=a;i++) {
while(head<=tail&&hang_mx[i][j]>=hang_mx[list[tail]][j])tail--;
list[++tail]=i;
while(head<tail&&list[head]<i-n+1)head++;
lie_mx[i][j]=hang_mx[list[head]][j];
}
head=1;tail=1;list[1]=1;
for(int i=2;i<n;i++) {
while(head<=tail&&hang_mn[i][j]<=hang_mn[list[tail]][j])tail--;
list[++tail]=i;
}
for(int i=n;i<=a;i++) {
while(head<=tail&&hang_mn[i][j]<=hang_mn[list[tail]][j])tail--;
list[++tail]=i;
while(head<tail&&list[head]<i-n+1)head++;
lie_mn[i][j]=hang_mn[list[head]][j];
}
}
int ans=999999999;
for(int i=n;i<=a;i++)for(int j=n;j<=b;j++)ans=min(ans,lie_mx[i][j]-lie_mn[i][j]);printf("%d\n",ans);
return 0;
}
相關文章
- 單調佇列佇列
- 單調棧/單調佇列佇列
- 單調佇列雙端佇列佇列
- P2216 [HAOI2007]理想的正方形(二維RMQ)MQ
- 單調棧 和 單調佇列佇列
- 單調棧和單調佇列佇列
- POJ 2823 單調佇列佇列
- hdu 3415 單調佇列佇列
- HDU 3530 單調佇列佇列
- hdu 3401 單調佇列+DP佇列
- hdu 4122 單調佇列佇列
- 單調佇列最佳化 DP佇列
- POJ 3017 單調佇列dp佇列
- hdu4374單調佇列+dp佇列
- 佇列-單端佇列佇列
- 多重揹包問題的單調佇列優化佇列優化
- HDU3530 單調佇列的應用佇列
- C語言 簡單的佇列(陣列佇列)C語言佇列陣列
- noi.ac #289. 電梯(單調佇列)佇列
- HDU 3530 Subsequence (dp+單調佇列)佇列
- poj3017 dp+單調佇列佇列
- hdu3415 單調佇列求區間最大和佇列
- hdu 4122Alice's mooncake shop(單調佇列)佇列
- [學習筆記] 單調佇列最佳化DP - DP筆記佇列
- laravel 佇列的簡單使用Laravel佇列
- POJ2823 Sliding Window (單調佇列的基本應用)佇列
- POJ 2823Sliding Window(單調佇列水題)佇列
- RabbitMQ-簡單佇列MQ佇列
- 單向鏈式佇列佇列
- 棧,佇列,優先順序佇列簡單介面使用佇列
- HDU 4123 Bob's Race:樹的直徑 + 單調佇列 + st表佇列
- “簡單”的訊息佇列與kafka佇列Kafka
- 簡單易用的任務佇列-beanstalkd佇列Bean
- 多重揹包O(N*V)演算法詳解(使用單調佇列)演算法佇列
- 佇列_單向連結串列佇列
- 佇列、阻塞佇列佇列
- 陣列模擬佇列 以及佇列的複用(環形佇列)陣列佇列
- FZU 1894 單調佇列入門佇列