求调
查看原帖
求调
1032391
封禁用户楼主2025/1/4 15:06

rt

#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define deap(i,a,b) for(int i=a;i>=b;i--)
#define in(a) a=read()
const int N = 1e3+5;
const int inf = INT_MAX;
inline int read() {
	int x=0,f=1;
	char ch=getchar();
	while (ch<'0'||ch>'9') {
		if (ch=='-') f=-1;
		ch=getchar();
	}
	while (ch>='0'&&ch<='9') {
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*f;
}
void fast() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
}
int n,k,a[N][N],b[N];
int p;
bool check(int x) {
	memset(b,0,sizeof b);
	//cout<<x<<':' ;
	int i=1,j=1,ans=0,bit=1;
	while(i<=k) {//初始化扫描线
		while(j<=k) {
			if(a[j][i]<=x) {
				b[i]++;
				ans++;
			}
			j++;
		}
		j=1;
		i++;
	}                   
	//cout<<ans<<' ';
	if(ans>p)return true;//如果初始化的结果成立,返回 true
	while(i<=n) { //初始化重合数组
		while(j<=k) {
			if(a[j][i]<=x) {//扫描到的新增元素
				b[i]++;
				ans++;
			}
			if(a[i-k][j]<=x) {//删除边界元素
				ans--;
			}
			j++;
		}              
	//	cout<<ans<<' ';
		if(ans>p)return true;//如果初始化的结果成立,返回 true
		j=1;
		i++;
	}
	j=k; 
	while(j<=n) { //开始 S 型扫描
		while(1<=i&&i<=n) { //整行扫描
			ans=ans+b[i]-b[i-bit*k];

		//	cout<<ans<<' ';       
			if(ans>p)return true;//如果扫描结果成立,返回 true
			i+=bit;
		}
		j++;
		bit=-bit;
		i+=bit*k;
		rep(vis,1,n){//重合数组整体下移 
			if(a[j][vis]<=x) {
				b[vis]++;
			}
			if(a[j-k][vis]<=x) {
				b[vis]--;
			}
		}
		int l=i-bit*k,r=i;
		if(l>r)swap(l,r);
		rep(vis,l,r){
			if(a[j][vis]<=x) {
				ans++;
			}
			if(a[j-k][vis]<=x) {
				ans--;                
			}
		} 
		 
	}
	return false;
}
signed main() {
	//fast();
	in(n),in(k);
	int l=0,r=INT_MIN;
	p=((k*k)>>1)-(!((k*k)&1));

	rep(i,1,n) {
		rep(j,1,n) {
			in(a[i][j]);
			if(a[i][j]>r)r=a[i][j];
		}
	}
	int ans=r;
	while(l<=r) {
		int mid=(l+r)>>1;
		if(check(mid))ans=mid,r=mid-1;
		else l=mid+1;  
	}        
	cout<<ans;
	return 0;
}
/*
3 2
1 7 0
5 8 11
10 4 2
*/
2025/1/4 15:06
加载中...