[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

 

转载于:https://www.cnblogs.com/KingSann/articles/6344776.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值