这题特判的意义是什么
查看原帖
这题特判的意义是什么
483966
一粒夸克楼主2021/6/24 16:57

为什么题解里都要特判单点k<=ai,j<=2kk<=a_{i,j}<=2*k的情况

不特判也没有影响吧

不特判甚至更快

#include<bits/stdc++.h>
using namespace std;
int n,k;
long long a[2005][2005],s[2005][2005];
inline long long get(int a,int b,int c,int d){
	return s[c][d]-s[c][b-1]-s[a-1][d]+s[a-1][b-1];
}
int up[2005],stk[2005],top;
int main(){
	scanf("%d%d",&k,&n);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			scanf("%lld",&a[i][j]);
		}
	}
	for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)s[i][j]=s[i][j-1]+a[i][j];
	for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)s[i][j]+=s[i-1][j];
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n+1;j++){
			if(a[i][j]<=2*k&&j<=n)up[j]++;
			else up[j]=0;
			while(top&&up[stk[top]]>=up[j]){
				int x1=stk[top-1]+1,x2=j-1;
				int h=i-up[stk[top]]+1;
				if(get(h,x1,i,x2)>=k){
					while(get(h,x1,i,x2)>2*k){
						if(get(h,x1,h,x2)>2*k){
							while(get(h,x1,h,x2)>2*k)x1++;
							printf("%d %d %d %d\n",x1,h,x2,h);
							return 0;
						}
						h++;
					}
					printf("%d %d %d %d\n",x1,h,x2,i);
					return 0;
				}
				top--;
			}
			if(j<=n)stk[++top]=j;
		}
	}
	puts("NIE");
	return 0;
}
2021/6/24 16:57
加载中...