比赛 进阶指南第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; 
}