CodeForces 226C The table[贪心]

本文介绍了一种在矩阵中寻找和为负数的行或列并进行取反操作的算法,通过每次取反负和的行或列,确保矩阵总和至少增加2,从而有效优化矩阵状态。该算法复杂度为O(n×10^6),适用于值域较小的场景。

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

可以发现每次取反负的行或者列一定会让矩阵和至少增加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, ' ';
}

转载于:https://www.cnblogs.com/storz/p/10463475.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值