比赛 进阶指南第0章测试 评测结果 AAAAAAAAAA
题目名称 Brownie Slicing G 最终得分 100
用户昵称 2_16鸡扒拌面 运行时间 0.332 s
代码语言 C++ 内存使用 4.51 MiB
提交时间 2026-03-14 10:01:27
显示代码纯文本
#include<bits/stdc++.h>
#define MAXN 505
#define ll long long
using namespace std;

int r,c,a,b;
int g[MAXN][MAXN],s[MAXN][MAXN];

int q(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];}

bool check(int x)
{
	int row=0,lr=1;
	for(int i=1;i<=r;i++)
	{
		int col=0,lc=1;
		for(int j=1;j<=c;j++)
		{
			if(q(lr,lc,i,j)>=x)
			{
				col++;
				lc=j+1;
			}
		}
		if(col>=b)
		{
			row++;
			lr=i+1;
		}
	}
	return row>=a;
}

int main()
{
	freopen("brownie.in","r",stdin);
	freopen("brownie.out","w",stdout);
	cin>>r>>c>>a>>b;
	for(int i=1;i<=r;i++)
		for(int j=1;j<=c;j++)
			cin>>g[i][j];
	for(int i=1;i<=r;i++)
		for(int j=1;j<=c;j++)
			s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+g[i][j];
	ll L=0,rr=s[r][c],ans=0;
	while(L<=rr)
	{
		int mid=(L+rr)/2;
		if(check(mid))
		{
			ans=mid;
			L=mid+1;
		}
		else rr=mid-1;
	}
	cout<<ans<<endl;
	return 0;
}