警示后人,如果你76pts
查看原帖
警示后人,如果你76pts
736801
MspAInt楼主2025/2/2 00:09

76pts求调。

我操你吗的傻子POI出题人父母都是被这狗屎题气死的吗,了字吧不让下数据春额伊哈,,,

#include<bits/stdc++.h>
#define LL long long
using namespace std;

const int N=2e3+10;
int n,m,a[N][N],up[N][N],st[N],top;
LL s[N][N];

LL sum(int x1,int y1,int x2,int y2){
	return s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1];
}

signed main(){
	// freopen(".in","r",stdin);
	// freopen(".out","w",stdout);
	scanf("%d%d",&m,&n);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			scanf("%d",&a[i][j]),s[i][j]=a[i][j]+s[i-1][j]+s[i][j-1]-s[i-1][j-1];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(a[i][j]>=m&&a[i][j]<=2*m)return printf("%d %d %d %d\n",j,i,j,i),0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(a[i][j]>2*m)up[i][j]=i;
			else up[i][j]=up[i-1][j];
	for(int i=1;i<=n;i++){
		top=0;
		for(int j=1;j<=n;j++){
			while(top&&up[i][st[top]]<=up[i][j])top--;
			int k=st[top]+1,h=up[i][j]+1;
            st[++top]=j;
			assert(k==1||up[i][k-1]>up[i][j]);
			if(sum(h,k,i,j)<m)continue;
			while(sum(h,k,i,j)>2*m){
				if(sum(h,k,h,j)>=m){
					while(sum(h,k,h,j)>2*m)k++;
					printf("%d %d %d %d\n",k,h,j,h);
					return 0;
				}
				h++;
            }
			printf("%d %d %d %d\n",k,h,j,i);
			return 0;
		}
	}
	puts("NIE");
	return 0;
}
2025/2/2 00:09
加载中...