关于st表开O2RE
查看原帖
关于st表开O2RE
520056
luoyx楼主2022/6/6 11:29

不开O2AC,开了O2全RE

#include <bits/stdc++.h>
#define N 1005
using namespace std;
int n,m,l;
int a[N][N];
int dp[N][N][12],dp2[N][N][12];
int t[N][2];
int init(){
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			dp[i][j][0]=dp2[i][j][0]=a[j][i];
		}
	}
	for(int i=1;i<=m;i++){
		for(int k=1;k<=11;k++){
			for(int j=1;j+(1<<k)-1<=n;j++){
				dp[i][j][k]=max(dp[i][j][k-1],dp[i][j+(1<<(k-1))][k-1]);
				dp2[i][j][k]=min(dp2[i][j][k-1],dp2[i][j+(1<<(k-1))][k-1]);
			}
		}
	}
}
int q_max(int j,int l,int r){
	int k=log2(r-l+1);
	return max(dp[j][l][k],dp[j][r-(1<<k)+1][k]);
}
int q_min(int j,int l,int r){
	int k=log2(r-l+1);
	return min(dp2[j][l][k],dp2[j][r-(1<<k)+1][k]);
}
int query(int k){
	int ANS=1e9;
	for(int i=1;i+k-1<=n;i++){
		int l=i,r=i+k-1;
		for(int j=1;j<=m;j++){
			t[j][0]=q_max(j,l,r);
			t[j][1]=q_min(j,l,r);
		}
		deque<int> q,q2;
		for(int j=1;j<=m;j++){
			while(!q.empty()&&q.front()+k-1<j)
				q.pop_front();
			while(!q.empty()&&t[q.back()][0]<t[j][0])
				q.pop_back();
			q.push_back(j);
			while(!q2.empty()&&q2.front()+k-1<j)
				q2.pop_front();
			while(!q2.empty()&&t[q2.back()][1]>t[j][1])
				q2.pop_back();
			q2.push_back(j);
			if(j>=k) ANS=min(ANS,t[q.front()][0]-t[q2.front()][1]);
		}
	}
	return ANS;
}
int main(){
	cin>>n>>m>>l;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			scanf("%d",&a[i][j]);
		}
	}
	init();
	cout<<query(l);
}
2022/6/6 11:29
加载中...