#include <bits/stdc++.h>
#define maxn 300005
#define maxm 25
#define fi first
#define se second
using namespace std;
using ii = pair<int, int>;
int n, m;
int a[maxn][maxm];
namespace sub1 {
int cnt[maxm];
void mainProgram() {
int pivot = n/2;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) cnt[j] += a[i][j];
for (int i1 = 1; i1 <= n; i1++) {
int ans = 0;
for (int j = 1; j <= m; j++) cnt[j] -= a[i1][j];
for (int i2 = 1; i2 <= n; i2++) {
if (i2 == i1) continue;
for (int j = 1; j <= m; j++) cnt[j] -= a[i2][j];
int ds = 0;
for (int j = 1; j <= m; j++) ds += (cnt[j] >= pivot);
ans = max(ans, ds);
for (int j = 1; j <= m; j++) cnt[j] += a[i2][j];
}
cout << ans << "\n";
for (int j = 1; j <= m; j++) cnt[j] += a[i1][j];
}
exit(0);
}
}
namespace sub2 {
int dem[1<<10], cnt[maxm], orz[maxn];
void mainProgram() {
int piv = n/2;
for (int i = 1; i <= n; i++) {
int mask = 0;
for (int j = 1; j <= m; j++) {
cnt[j] += a[i][j];
mask |= ((a[i][j])<<(j-1));
}
orz[i] = mask;
++dem[mask];
}
for (int i = 1; i <= n; i++) {
int ans = m;
for (int j = 1; j <= m; j++) cnt[j] -= a[i][j];
int mask = 0, ds = INT_MAX;
for (int j = 1; j <= m; j++)
if (cnt[j] < piv) --ans;
else if (cnt[j] == piv) mask |= (1<<(j-1));
for (int cmask = 0; cmask < (1<<m); cmask++) if (dem[cmask]-(cmask==orz[i])) ds = min(ds, __builtin_popcount(cmask&mask));
for (int j = 1; j <= m; j++) cnt[j] += a[i][j];
cout << ans-ds << "\n";
}
exit(0);
}
}
namespace sub3 {
int cnt[1<<14],dem[maxm];
int ans[maxn];
vector<int> nho[1<<14];
void mainProgram() {
int piv = n/2;
for (int i = 1; i <= n; i++) {
int mask = 0;
for (int j = 1; j <= m; j++) {
mask |= ((a[i][j])<<(j-1));
dem[j] += a[i][j];
}
++cnt[mask];
nho[mask].emplace_back(i);
}
for (int mask = 0; mask < (1<<m); mask++) {
if (nho[mask].empty()) continue;
--cnt[mask];
int hmask = 0;
for (int j = 0; j < m; j++)
dem[j+1] -= (mask>>j&1);
for (int j = 0; j < m; j++)
if (dem[j+1] == piv) hmask |= (1<<j);
for (int j = 0; j < m; j++)
dem[j+1] += (mask>>j&1);
int orz = INT_MAX;
for (int cmask = 0; cmask < (1<<m); cmask++)
if (cnt[cmask]) orz = min(orz, __builtin_popcount(hmask&cmask));
for (int idx : nho[mask]) ans[idx] = orz;
++cnt[mask];
}
for (int i = 1; i <= n; i++) {
int kq = m;
for (int j = 1; j <= m; j++) dem[j] -= a[i][j];
int mask = 0;
for (int j = 1; j <= m; j++) {
if (dem[j] < piv) --kq;
}
kq -= ans[i];
for (int j = 1; j <= m; j++) dem[j] += a[i][j];
cout << kq << "\n";
}
exit(0);
}
}
namespace subfull {
const int INF = 1'000'000'000;
struct num {
int x = INF, tx = INF, y = INF, ty = INF;
num() {}
num(int _x, int _tx, int _y, int _ty) : x(_x), tx(_tx), y(_y), ty(_ty) {}
} f[1<<20], g[1<<20];
void cmn(num &a, const ii &b) {
if (a.x > b.fi) a = num(b.fi, b.se, a.x, a.tx);
else if (a.y > b.fi && b.se != a.tx) a = num(a.x, a.tx, b.fi, b.se);
}
void cmin(num &a, const num &b) {
cmn(a, ii{b.x, b.tx});
cmn(a, ii{b.y, b.ty});
}
int cnt[1<<20], dem[maxm];
void mainProgram() {
int piv = n/2;
for (int i = 1; i <= n; i++) {
int mask = 0;
for (int j = 1; j <= m; j++) {
mask |= ((a[i][j])<<(j-1));
dem[j] += a[i][j];
}
++cnt[mask];
}
for (int mask = 0; mask < (1<<m); mask++)
if (cnt[mask]) f[mask] = num(__builtin_popcount(mask), mask, INF, INF);
for (int i = 0; i < m; i++)
for (int mask = 0; mask < (1<<m); mask++)
if ((mask>>i&1) == 0) cmin(f[mask], f[mask^(1<<i)]);
for (int mask = 0; mask < (1<<m); mask++) {
f[mask].x -= __builtin_popcount(mask);
f[mask].y -= __builtin_popcount(mask);
}
for (int mask = 0; mask < (1<<m); mask++)
g[((1<<m)-1)^mask] = f[mask];
for (int i = 0; i < m; i++)
for (int mask = 0; mask < (1<<m); mask++)
if ((mask>>i&1) == 0) cmin(g[mask], g[mask^(1<<i)]);
for (int i = 1; i <= n; i++) {
int mask = 0, cur_mask = 0, kq = m;
for (int j = 1; j <= m; j++) {
dem[j] -= a[i][j];
if (dem[j] < piv) --kq;
else if (dem[j] == piv) mask |= (1<<(j-1));
cur_mask |= ((a[i][j])<<(j-1));
}
auto [x, tx, y, ty] = g[mask];
if (tx == cur_mask) {
if (cnt[cur_mask] > 1) kq -= x;
else kq -= y;
} else kq -= x;
cout << kq << "\n";
for (int j = 1; j <= m; j++)
dem[j] += a[i][j];
}
exit(0);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m;
for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> a[i][j];
if (n <= 3000)
sub1::mainProgram();
if (m <= 10)
sub2::mainProgram();
if (m <= 14)
sub3::mainProgram();
subfull::mainProgram();
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |