玄关求调
查看原帖
玄关求调
1430250
_hud楼主2025/7/25 11:37

如题。

我的思路是先纵向平均割好,然后横向用二维前缀和判断每一块巧克力豆是否相等。但交上去一片红 /ll。

帮这个蒟蒻调试一下吧 QaQ

代码:

#include <bits/stdc++.h>
using namespace std;
#define N 110
int n, m, h, v, s[N][N];
char mapp[N][N];
vector<int> rec;
inline int gets(int a, int b, int c, int d) {
    return s[c][d] - s[a - 1][d] - s[c][b - 1] + s[a - 1][b - 1];
}
inline string sol() {
    memset(s, 0, sizeof s); // 多测清空
    rec = {}; rec.reserve(v + 1);
    cin >> n >> m >> h >> v;
    for(int i = 1; i <= n; ++i) {
        cin >> (mapp[i] + 1);
        for(int j = 1; j <= m; ++j)
            s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + (mapp[i][j] == '@');
    }
    if(s[n][m] % ((h + 1) * (v + 1))) return "IMPOSSIBLE";
    int aim = s[n][m] / (v + 1), lst = 1;
    for(int j = 1, now; j <= m; ++j) {
        now = gets(1, lst, n, j);
        if(now > aim) return "IMPOSSIBLE";
        else if(now == aim) lst = j + 1, rec.push_back(lst);
    }
    if(lst != m + 1) return "IMPOSSIBLE";
    lst = 1, aim = s[n][m] / ((h + 1) * (v + 1));
    for(int i = 1; i <= n; ++i) {
        int tmp = 1; bool f = 1;
        for(int x : rec) {
            // cout << lst << ' ' << tmp << ' ' << i << ' ' << x - 1 << '\n';
            int now = gets(lst, tmp, i, x - 1);
            if(now > aim) return "IMPOSSIBLE";
            else if(now == aim) tmp = x;
            else { f = 0; break; }
        }
        if(f) lst = i + 1;
    }
    return lst == n + 1 ? "POSSIBLE" : "IMPOSSIBLE";
}
signed main() {
    int T; cin >> T;
    for(int i = 1; i <= T; ++i) cout << "Case #" << i << ": " << sol() << '\n';
    return 0;
}
2025/7/25 11:37
加载中...