如题。
我的思路是先纵向平均割好,然后横向用二维前缀和判断每一块巧克力豆是否相等。但交上去一片红 /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;
}