一直找和是负的行/者列取反就行了....
可以发现每次取反负的行或者列一定会让矩阵和至少增加2 所以这个过程一定会结束,因为 值域 n m都很小 复杂度 (O(n imes 10^6)) (维护一下每行的和每列的和)
偷懒写了个最坏 (O(n^2 imes 10^6)) 的过了
其实我感觉无法构造出让复杂度达到上界的矩阵
int n, m;
int a[105][103];
bool cnt[205];
void init() {
}
int check() {
int pre = 0;
lo1(i, n) {
pre = 0;
lo1(j, m) pre += a[i][j];
if (pre < 0) return i;
}
lo1(i, m) {
pre = 0;
lo1(j, n) pre += a[j][i];
if (pre < 0) return i + n;
}
return 0;
}
void solve() {
n = in, m = in;
lo1(i, n) lo1(j, m) in, a[i][j];
int ss;
while (ss = check()) {
cnt[ss] ^= 1;
if (ss > n) {
ss -= n;
lo1(i, n) a[i][ss] *= -1;
}
else lo1(i, m) a[ss][i] *= -1;
}
vint ans;
lo1(i, n) if (cnt[i]) ans.pb(i);
out, (int)(ans.size()), ' ';
for (auto it : ans) out, it, ' ';
puts(""), ans.clear();
lo1(i, m) if (cnt[i + n]) ans.pb(i);
out, (int)(ans.size()), ' ';
for (auto it : ans) out, it, ' ';
}