CodeForces 226C The table[贪心]

一直找和是负的行/者列取反就行了....

可以发现每次取反负的行或者列一定会让矩阵和至少增加2 所以这个过程一定会结束,因为 值域 n m都很小 复杂度 \(O(n \times 10^6)\) (维护一下每行的和每列的和)

偷懒写了个最坏 \(O(n^2\times 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, ' ';
}
posted @ 2019-03-02 22:57  QvvQ  阅读(189)  评论(0编辑  收藏  举报