| 比赛 |
进阶指南第0章测试 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
Brownie Slicing G |
最终得分 |
100 |
| 用户昵称 |
dbk |
运行时间 |
0.264 s |
| 代码语言 |
C++ |
内存使用 |
4.09 MiB |
| 提交时间 |
2026-03-14 13:21:10 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N = 510;
int ch[N][N];
int r, c, a, b, ll = 0, rr;
int query(int x1, int y1, int x2, int y2){
return ch[x2][y2] - ch[x2][y1 - 1] - ch[x1 - 1][y2] + ch[x1 - 1][y1 - 1];
}
bool check(int x){
int li = 1, lj = 1, A = 0;
for(int i = 1;i <= r;i++){
int B = 0, stj = lj;
for(int j = 1;j < c;j++){
if(B == b - 1){
break ;
}
if(query(li, stj, i, j) >= x){
B++;
stj = j + 1;
}
}
// cout<<"LJ:"<<lj<<endl;
if(B >= b - 1 && query(li, stj, i, c) >= x){
li = i + 1;
// cout<<li<<endl;
A++;
lj = 1;
}
}
return A >= 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 >> ch[i][j];
rr += ch[i][j];
ch[i][j] += ch[i - 1][j] + ch[i][j - 1] - ch[i - 1][j - 1];
}
}
// cout<<check(4)<<endl;
while(ll < rr){
int mid = (ll + rr + 1) >> 1;
if(check(mid)){
ll = mid;
}
else{
rr = mid - 1;
}
}
cout<<ll<<endl;
}