社区讨论

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 条回复,欢迎继续交流。

正在加载回复...