[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 }