社区讨论
40pts求助
P2216[HAOI2007] 理想的正方形参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m3e7p85w
- 此快照首次捕获于
- 2024/11/12 16:50 去年
- 此快照最后确认于
- 2024/11/12 20:15 去年
CPP
#include<bits/stdc++.h>
using namespace std;
int m[1001][1001],x[1001][1001],X[1001][1001],y[1001][1001],Y[1001][1001],ans=0x3f3f3f3f;
struct node{
int shu;
int id;
}a[1001000];
struct node1{
int shu;
int id;
}b[1001000];
deque<node> q;//队首最小
deque<node1> p;//队首最大
int main(){
int a1,b1,n;
scanf("%d %d %d",&a1,&b1,&n);
for(int i=1;i<=a1;i++){
while(!q.empty())q.pop_front();
while(!p.empty())p.pop_front();
for(int j=1;j<=b1;j++){
scanf("%d",&m[i][j]);
a[j].shu=m[i][j];
a[j].id=j;
b[j].shu=m[i][j];
b[j].id=j;
while(!q.empty()&&q.back().shu>a[j].shu)q.pop_back();//如果队列非空且队尾大于当前数就弹出
q.push_back(a[j]);//进队
while(!p.empty()&&p.back().shu<b[j].shu)p.pop_back();//如果队列非空且队尾大于当前数就弹出
p.push_back(b[j]);//进队
if(j>=n){//开始输出
while(!q.empty()&&j-q.front().id>=n)q.pop_front();//如果队列非空且队首不在窗口内就出队
x[i][j-n+1]=q.front().shu;
while(!p.empty()&&j-p.front().id>=n)p.pop_front();//如果队列非空且队首不在窗口内就出队
X[i][j-n+1]=p.front().shu;
}
}
}
for(int i=1;i<=b1-n+1;i++){
while(!q.empty())q.pop_front();
while(!p.empty())p.pop_front();
for(int j=1;j<=a1;j++){
a[j].shu=x[j][i];
a[j].id=j;
b[j].shu=X[j][i];
b[j].id=j;
while(!q.empty()&&q.back().shu>x[j][i])q.pop_back();//如果队列非空且队尾大于当前数就弹出
q.push_back(a[j]);//进队
while(!p.empty()&&p.back().shu<X[j][i])p.pop_back();//如果队列非空且队尾大于当前数就弹出
p.push_back(b[j]);//进队
if(j>=n){//开始输出
while(!q.empty()&&j-q.front().id>=n)q.pop_front();//如果队列非空且队首不在窗口内就出队
y[j-n+1][i]=q.front().shu;
while(!p.empty()&&j-p.front().id>=n)p.pop_front();//如果队列非空且队首不在窗口内就出队
Y[j-n+1][i]=p.front().shu;
}
}
}
for(int i=1;i<=a1-n+1;i++){
for(int j=1;j<=b1-n+1;j++){
ans=min(Y[i][j]-y[i][j],ans);
}
}
printf("%d",ans);
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...