社区讨论

人傻常数大,求卡常

P2216[HAOI2007] 理想的正方形参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo2d8zga
此快照首次捕获于
2023/10/23 11:56
2 年前
此快照最后确认于
2023/11/03 12:04
2 年前
查看原帖
1、 下面这段代码是 O(abn)O(abn) 的吗?
2、如果是,那么如何不吸氧过此题?
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1002;
int a,b,n,m[N][N],ans=2e9;
int mn[N][N],mx[N][N];
struct que{
	int val[N],head=0,tail=1;
	inline int size(){return head-tail+1;}
	inline int front(){return val[head];}
	inline int back(){return val[tail];}
	inline void pop_front(){--head;}
	inline void pop_back(){++tail;}
	inline void push_front(int x){val[++head]=x;};
	inline void push_back(int x){val[--tail]=x;}
}qmn[N],qmx[N];
template<typename T>inline void read(T &ret){
	ret=0;T fh=1;char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')fh=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')ret=(ret<<1)+(ret<<3)+(ch^48),ch=getchar();
	ret*=fh;
}
int main(){
	read(a);read(b);read(n); 
	for(int i=1;i<=a;++i)
		for(int j=1;j<=b;++j){
			read(m[i][j]);
			mx[i][j]=mn[i][j]=m[i][j];
		}
	for(int j=1;j<=b;++j){
		for(int i=1;i<=a;i++){
			while(qmn[i].size()&&m[i][qmn[i].front()]>=m[i][j])qmn[i].pop_front();
			while(qmn[i].size()&&qmn[i].back()<=j-n)qmn[i].pop_back();
			qmn[i].push_front(j);
			while(qmx[i].size()&&m[i][qmx[i].front()]<=m[i][j])qmx[i].pop_front();
			while(qmx[i].size()&&qmx[i].back()<=j-n)qmx[i].pop_back();
			qmx[i].push_front(j);
			if(j>=n&&i>=n){
				for(int k=1;k<=n;++k){
					int x=i-n+k,y=j-n+1,p=i-n+1;
					mn[p][y]=min(mn[p][y],m[x][qmn[x].back()]);
					mx[p][y]=max(mx[p][y],m[x][qmx[x].back()]);
				}
			}
		}
	}
	for(int i=1;i<=a-n+1;++i)
		for(int j=1;j<=b-n+1;++j)
			ans=min(ans,mx[i][j]-mn[i][j]);
	printf("%d\n",ans);
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...