[bzoj1047]理想的正方形

二维滑动窗口裸题。。

(压代码出奇迹233333)

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <queue>
 5 #define N 2000
 6 int T[N][N],A[N][N],B[N][N],a,b,n,ans=0x3f3f3f3f;
 7 std::deque<std::pair<int,int> >q;
 8 #define sub(NUM,SEG,OP) for(int i=1;i<=a;i++){q.clear();\
 9     for(int j=1;j<=b;j++){\
10         while(q.size()&&j-q.front().second>=n)q.pop_front();\
11         while(q.size()&&q.back().first OP NUM)q.pop_back();\
12         q.push_back(std::make_pair(NUM,j)),SEG=q.front().first;}}std::swap(a,b);
13 #define w(X,O) sub(T[i][j],X[i][j],O)sub(X[j][i],X[j][i],O)
14 #define T(A,B) for(int i=B;i<=a;i++)for(int j=B;j<=b;j++)A;
15 int main(){
16     scanf("%d%d%d",&a,&b,&n);
17     T(scanf("%d",&T[i][j]),1)
18     w(A,<)w(B,>)
19     T(ans=std::min(ans,A[i][j]-B[i][j]),n)
20     printf("%d\n",ans);
21 }
View Code

 

posted @ 2017-01-23 18:55  KingSann  阅读(298)  评论(0编辑  收藏  举报