你说得对
查看原帖
你说得对
540363
AKPC楼主2023/8/26 11:02

赏 4 关,下载不到数据,单调队列玄学错误 80pts

#include <bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
    int x=0;bool f=1;register char c=getchar();
    while (c<48||c>57){if(c=='-') f=0;c=getchar();}
    while (c>=48&&c<=57){x=x*10+(c^48);c=getchar();}
    return f?x:-x;
}
void quee(int a[],int ans[],int n,int m,int op){
	deque<pair<int,int> >que;
	for (int i=1;i<=n;i++){
		pair<int,int>Pair(a[i],i);
		if (!que.empty()) if (que.back().second<=i-m) que.pop_back();
		while (1){
			if (que.empty()) break;
			if (op==2&&que.front().first>=a[i]) break;
			if (op==1&&que.front().first<=a[i]) break;
			que.pop_front();
		}
		que.push_front(Pair);
		if (i>=m) ans[i-m+1]=que.back().first;
	}
	while (!que.empty()) que.pop_front();
}
int a=read(),b=read(),n=read(),sb=max(a,b),f[1005][1005],f1[1005][1005],f2[1005][1005],f3[1005][1005],f4[1005][1005],minn=1e18;
signed main(){
	for (int i=1;i<=a;i++) for (int j=1;j<=b;j++) f[i][j]=read();
	for (int i=1;i<=sb;i++) for (int j=1;j<=sb;j++) f1[i][j]=f3[i][j]=1e18,f2[i][j]=f4[i][j]=-1e18;
	for (int i=1;i<=a;i++){
		quee(f[i],f1[i],b,n,1);
		quee(f[i],f2[i],b,n,2);
//		for (int j=1;j<=b-n+1;j++) cout<<f1[i][j]<<','<<f2[i][j]<<' ';
//		cout<<'\n';
	}
	for (int i=1;i<=a;i++){
//		cout<<'\n';
		for (int j=1;j<=b;j++){
			if (i<j) swap(f1[i][j],f1[j][i]),swap(f2[i][j],f2[j][i]);
//			if (f2[i][j]<=-1e18) continue;
//			cout<<f1[i][j]<<','<<f2[i][j]<<' ';
		}
	}
//	cout<<"\n\n";
	for (int i=1;i<=b-n+1;i++){
		quee(f1[i],f3[i],a,n,1);
		quee(f2[i],f4[i],a,n,2);
	}
	for (int i=1;i<=a-n+1;i++){
//		cout<<'\n';
		for (int j=1;j<=b-n+1;j++){
//			cout<<f3[i][j]<<','<<f4[i][j]<<' ';]
			minn=min(minn,f4[i][j]-f3[i][j]);
		}
	}
	cout<<minn;
	return 0;
}
2023/8/26 11:02
加载中...